/******************************************************************************
|
*
|
* Copyright(c) 2019 Realtek Corporation.
|
*
|
* 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.
|
*
|
*****************************************************************************/
|
/*
|
The purpose of hal_io.c
|
|
a. provides the API
|
b. provides the protocol engine
|
c. provides the software interface between caller and the hardware interface
|
|
Compiler Flag Option:
|
1. CONFIG_SDIO_HCI:
|
a. USE_SYNC_IRP: Only sync operations are provided.
|
b. USE_ASYNC_IRP:Both sync/async operations are provided.
|
|
2. CONFIG_USB_HCI:
|
a. USE_ASYNC_IRP: Both sync/async operations are provided.
|
|
3. CONFIG_CFIO_HCI:
|
b. USE_SYNC_IRP: Only sync operations are provided.
|
|
Only sync read/rtw_write_mem operations are provided.
|
*/
|
|
#define _HAL_IO_C_
|
#include "hal_headers.h"
|
|
u8 _hal_read8(struct rtw_hal_com_t *hal, u32 addr)
|
{
|
u8 r_val;
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
u8(*_read8)(struct rtw_hal_com_t *hal, u32 addr);
|
|
#ifdef DBG_PHL_MAC_REG_RW
|
if (rtw_hal_mac_reg_chk(hal, addr) == false) {
|
r_val = 0xEA;
|
return r_val;
|
}
|
#endif
|
|
_read8 = io_priv->io_ops._read8;
|
r_val = _read8(hal, addr);
|
return r_val;
|
}
|
|
u16 _hal_read16(struct rtw_hal_com_t *hal, u32 addr)
|
{
|
u16 r_val;
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
u16(*_read16)(struct rtw_hal_com_t *hal, u32 addr);
|
|
#ifdef DBG_PHL_MAC_REG_RW
|
if (rtw_hal_mac_reg_chk(hal, addr) == false) {
|
r_val = 0xEAEA;
|
return r_val;
|
}
|
#endif
|
|
_read16 = io_priv->io_ops._read16;
|
r_val = _read16(hal, addr);
|
return r_val;
|
}
|
|
u32 _hal_read32(struct rtw_hal_com_t *hal, u32 addr)
|
{
|
u32 r_val;
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
u32(*_read32)(struct rtw_hal_com_t *hal, u32 addr);
|
|
#ifdef DBG_PHL_MAC_REG_RW
|
if (rtw_hal_mac_reg_chk(hal, addr) == false) {
|
r_val = 0xEAEAEAEA;
|
return r_val;
|
}
|
#endif
|
|
_read32 = io_priv->io_ops._read32;
|
r_val = _read32(hal, addr);
|
return r_val;
|
}
|
|
int _hal_write8(struct rtw_hal_com_t *hal, u32 addr, u8 val)
|
{
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
int (*_write8)(struct rtw_hal_com_t *hal, u32 addr, u8 val);
|
#ifdef RTW_WKARD_BUS_WRITE
|
int (*_write_post_cfg)(struct rtw_hal_com_t *hal, u32 addr,
|
u32 value) = NULL;
|
#endif
|
int ret;
|
|
#ifdef DBG_PHL_MAC_REG_RW
|
if (rtw_hal_mac_reg_chk(hal, addr) == false)
|
return 0;
|
#endif
|
|
_write8 = io_priv->io_ops._write8;
|
ret = _write8(hal, addr, val);
|
|
#ifdef RTW_WKARD_BUS_WRITE
|
_write_post_cfg = io_priv->io_ops._write_post_cfg;
|
if(NULL != _write_post_cfg) {
|
ret = _write_post_cfg(hal, addr, val);
|
}
|
#endif
|
return ret;
|
}
|
int _hal_write16(struct rtw_hal_com_t *hal, u32 addr, u16 val)
|
{
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
int (*_write16)(struct rtw_hal_com_t *hal, u32 addr, u16 val);
|
#ifdef RTW_WKARD_BUS_WRITE
|
int (*_write_post_cfg)(struct rtw_hal_com_t *hal, u32 addr,
|
u32 value) = NULL;
|
#endif
|
int ret;
|
|
#ifdef DBG_PHL_MAC_REG_RW
|
if (rtw_hal_mac_reg_chk(hal, addr) == false)
|
return 0;
|
#endif
|
|
_write16 = io_priv->io_ops._write16;
|
ret = _write16(hal, addr, val);
|
|
#ifdef RTW_WKARD_BUS_WRITE
|
_write_post_cfg = io_priv->io_ops._write_post_cfg;
|
if(NULL != _write_post_cfg) {
|
ret = _write_post_cfg(hal, addr, val);
|
}
|
#endif
|
return ret;
|
}
|
int _hal_write32(struct rtw_hal_com_t *hal, u32 addr, u32 val)
|
{
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
int (*_write32)(struct rtw_hal_com_t *hal, u32 addr, u32 val);
|
#ifdef RTW_WKARD_BUS_WRITE
|
int (*_write_post_cfg)(struct rtw_hal_com_t *hal, u32 addr,
|
u32 value) = NULL;
|
#endif
|
int ret;
|
|
#ifdef DBG_PHL_MAC_REG_RW
|
if (rtw_hal_mac_reg_chk(hal, addr) == false)
|
return 0;
|
#endif
|
|
_write32 = io_priv->io_ops._write32;
|
ret = _write32(hal, addr, val);
|
|
#ifdef RTW_WKARD_BUS_WRITE
|
_write_post_cfg = io_priv->io_ops._write_post_cfg;
|
if(NULL != _write_post_cfg) {
|
ret = _write_post_cfg(hal, addr, val);
|
}
|
#endif
|
return ret;
|
}
|
|
#ifdef CONFIG_SDIO_HCI
|
u8 _hal_sd_f0_read8(struct rtw_hal_com_t *hal, u32 addr)
|
{
|
u8 r_val = 0x00;
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
u8(*_sd_f0_read8)(struct rtw_hal_com_t *hal, u32 addr);
|
|
_sd_f0_read8 = io_priv->io_ops._sd_f0_read8;
|
|
if (_sd_f0_read8)
|
r_val = _sd_f0_read8(hal, addr);
|
|
return r_val;
|
}
|
|
#ifdef CONFIG_SDIO_INDIRECT_ACCESS
|
u8 _hal_sd_iread8(struct rtw_hal_com_t *hal, u32 addr)
|
{
|
u8 r_val = 0x00;
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
u8(*_sd_iread8)(struct rtw_hal_com_t *hal, u32 addr);
|
|
_sd_iread8 = io_priv->io_ops._sd_iread8;
|
|
if (_sd_iread8)
|
r_val = _sd_iread8(hal, addr);
|
return r_val;
|
}
|
|
u16 _hal_sd_iread16(struct rtw_hal_com_t *hal, u32 addr)
|
{
|
u16 r_val = 0x00;
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
u16(*_sd_iread16)(struct rtw_hal_com_t *hal, u32 addr);
|
|
_sd_iread16 = io_priv->io_ops._sd_iread16;
|
|
if (_sd_iread16)
|
r_val = _sd_iread16(hal, addr);
|
return r_val;
|
}
|
|
u32 _hal_sd_iread32(struct rtw_hal_com_t *hal, u32 addr)
|
{
|
u32 r_val = 0x00;
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
u32(*_sd_iread32)(struct rtw_hal_com_t *hal, u32 addr);
|
|
_sd_iread32 = io_priv->io_ops._sd_iread32;
|
|
if (_sd_iread32)
|
r_val = _sd_iread32(hal, addr);
|
return r_val;
|
}
|
|
int _hal_sd_iwrite8(struct rtw_hal_com_t *hal, u32 addr, u8 val)
|
{
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
int (*_sd_iwrite8)(struct rtw_hal_com_t *hal, u32 addr, u8 val);
|
int ret = -1;
|
|
_sd_iwrite8 = io_priv->io_ops._sd_iwrite8;
|
|
if (_sd_iwrite8)
|
ret = _sd_iwrite8(hal, addr, val);
|
|
return ret;
|
}
|
|
int _hal_sd_iwrite16(struct rtw_hal_com_t *hal, u32 addr, u16 val)
|
{
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
int (*_sd_iwrite16)(struct rtw_hal_com_t *hal, u32 addr, u16 val);
|
int ret = -1;
|
|
_sd_iwrite16 = io_priv->io_ops._sd_iwrite16;
|
|
if (_sd_iwrite16)
|
ret = _sd_iwrite16(hal, addr, val);
|
return ret;
|
}
|
int _hal_sd_iwrite32(struct rtw_hal_com_t *hal, u32 addr, u32 val)
|
{
|
struct hal_io_priv *io_priv = &hal->iopriv;
|
int (*_sd_iwrite32)(struct rtw_hal_com_t *hal, u32 addr, u32 val);
|
int ret = -1;
|
|
_sd_iwrite32 = io_priv->io_ops._sd_iwrite32;
|
|
if (_sd_iwrite32)
|
ret = _sd_iwrite32(hal, addr, val);
|
|
return ret;
|
}
|
#endif /* CONFIG_SDIO_INDIRECT_ACCESS */
|
#endif /* CONFIG_SDIO_HCI */
|
|
u32 hal_init_io_priv(struct rtw_hal_com_t *hal,
|
void (*set_intf_ops)(struct rtw_hal_com_t *hal, struct hal_io_ops *ops))
|
{
|
struct hal_io_priv *iopriv = &hal->iopriv;
|
|
if (set_intf_ops == NULL)
|
return RTW_HAL_STATUS_IO_INIT_FAILURE;
|
|
#ifdef CONFIG_SDIO_INDIRECT_ACCESS
|
_os_mutex_init(hal->drv_priv, &iopriv->sd_indirect_access_mutex);
|
#endif
|
set_intf_ops(hal, &iopriv->io_ops);
|
|
return RTW_HAL_STATUS_SUCCESS;
|
}
|
u32 hal_deinit_io_priv(struct rtw_hal_com_t *hal)
|
{
|
#ifdef CONFIG_SDIO_INDIRECT_ACCESS
|
struct hal_io_priv *iopriv = &hal->iopriv;
|
|
_os_mutex_init(hal->drv_priv, &iopriv->sd_indirect_access_mutex);
|
#endif
|
|
return RTW_HAL_STATUS_SUCCESS;
|
}
|
|
/*******************common IO APIs *******************/
|
static inline u32 _bit_shift(u32 mask)
|
{
|
u32 i;
|
|
for (i = 0; i <= 31; i++)
|
if (mask & BIT(i))
|
break;
|
|
return i;
|
}
|
|
u32 hal_read_macreg(struct hal_info_t *hal,
|
u32 offset, u32 bit_mask)
|
{
|
u32 val = 0, val32, shift;
|
|
val32 = hal_read32(hal->hal_com, offset);
|
if (bit_mask != 0xFFFFFFFF) {
|
shift = _bit_shift(bit_mask);
|
val = (val32 & bit_mask) >> shift;
|
return val;
|
}
|
else {
|
return val32;
|
}
|
}
|
void hal_write_macreg(struct hal_info_t *hal,
|
u32 offset, u32 bit_mask, u32 data)
|
{
|
u32 val32, shift;
|
|
if (bit_mask != 0xFFFFFFFF) {
|
val32 = hal_read32(hal->hal_com, offset);
|
shift = _bit_shift(bit_mask);
|
data = ((val32 & (~bit_mask)) | ((data << shift) & bit_mask));
|
}
|
|
hal_write32(hal->hal_com, offset, data);
|
}
|
|
u32 hal_read_bbreg(struct hal_info_t *hal,
|
u32 offset, u32 bit_mask)
|
{
|
u32 val32 = 0;
|
val32 = rtw_hal_read_bb_reg(hal->hal_com, offset, bit_mask);
|
|
return val32;
|
}
|
|
void hal_write_bbreg(struct hal_info_t *hal,
|
u32 offset, u32 bit_mask, u32 data)
|
{
|
rtw_hal_write_bb_reg(hal->hal_com, offset, bit_mask, data);
|
}
|
|
u32 hal_read_rfreg(struct hal_info_t *hal,
|
enum rf_path path, u32 offset, u32 bit_mask)
|
{
|
u32 val32 = 0;
|
val32 = rtw_hal_read_rf_reg(hal->hal_com, path, offset, bit_mask);
|
#ifdef DBG_IO
|
if (match_rf_read_sniff_ranges(hal->hal_com, path, offset, bit_mask)) {
|
PHL_INFO("DBG_IO hal_read_rfreg(%u, 0x%04x, 0x%08x) read:0x%08x(0x%08x)\n"
|
, path, offset, bit_mask, (val32 << _bit_shift(bit_mask)), val32);
|
}
|
#endif
|
|
return val32;
|
}
|
void hal_write_rfreg(struct hal_info_t *hal,
|
enum rf_path path, u32 offset, u32 bit_mask, u32 data)
|
{
|
rtw_hal_write_rf_reg(hal->hal_com, path, offset, bit_mask, data);
|
#ifdef DBG_IO
|
if (match_rf_write_sniff_ranges(hal->hal_com, path, offset, bit_mask)) {
|
PHL_INFO("DBG_IO hal_write_rfreg(%u, 0x%04x, 0x%08x) write:0x%08x(0x%08x)\n"
|
, path, offset, bit_mask, (data << _bit_shift(bit_mask)), data);
|
}
|
#endif
|
}
|
|
static u32 _cal_bit_shift(u32 bit_mask)
|
{
|
u32 i;
|
|
for (i = 0; i <= 31; i++) {
|
if (((bit_mask >> i) & 0x1) == 1)
|
break;
|
}
|
|
return (i);
|
}
|
|
void hal_write32_mask(struct rtw_hal_com_t *hal, u16 addr, u32 mask, u32 val)
|
{
|
u32 original_value, new_value;
|
u32 bit_shift;
|
|
if (mask == 0xFFFFFFFF) {
|
hal_write32(hal, addr, val);
|
} else {
|
original_value = hal_read32(hal, addr);
|
bit_shift = _cal_bit_shift(mask);
|
new_value = (((original_value) & (~mask)) | ((val << bit_shift) & mask));
|
hal_write32(hal, addr, new_value);
|
}
|
}
|
|
|
#ifdef DBG_IO
|
#define RTW_IO_SNIFF_TYPE_RANGE 0 /* specific address range is accessed */
|
#define RTW_IO_SNIFF_TYPE_VALUE 1 /* value match for sniffed range */
|
|
struct rtw_io_sniff_ent {
|
u8 chip;
|
u8 hci;
|
u32 addr;
|
u8 type;
|
union {
|
u32 end_addr;
|
struct {
|
u32 mask;
|
u32 val;
|
bool equal;
|
} vm; /* value match */
|
} u;
|
bool trace;
|
char *tag;
|
};
|
|
#define RTW_IO_SNIFF_RANGE_ENT(_chip, _hci, _addr, _end_addr, _trace, _tag) \
|
{.chip = _chip, .hci = _hci, .addr = _addr, .u.end_addr = _end_addr, .trace = _trace, .tag = _tag, .type = RTW_IO_SNIFF_TYPE_RANGE,}
|
|
#define RTW_IO_SNIFF_VALUE_ENT(_chip, _hci, _addr, _mask, _val, _equal, _trace, _tag) \
|
{.chip = _chip, .hci = _hci, .addr = _addr, .u.vm.mask = _mask, .u.vm.val = _val, .u.vm.equal = _equal, .trace = _trace, .tag = _tag, .type = RTW_IO_SNIFF_TYPE_VALUE,}
|
|
/* part or all sniffed range is enabled (not all 0) */
|
#define RTW_IO_SNIFF_EN_ENT(_chip, _hci, _addr, _mask, _trace, _tag) \
|
{.chip = _chip, .hci = _hci, .addr = _addr, .u.vm.mask = _mask, .u.vm.val = 0, .u.vm.equal = 0, .trace = _trace, .tag = _tag, .type = RTW_IO_SNIFF_TYPE_VALUE,}
|
|
/* part or all sniffed range is disabled (not all 1) */
|
#define RTW_IO_SNIFF_DIS_ENT(_chip, _hci, _addr, _mask, _trace, _tag) \
|
{.chip = _chip, .hci = _hci, .addr = _addr, .u.vm.mask = _mask, .u.vm.val = 0xFFFFFFFF, .u.vm.equal = 0, .trace = _trace, .tag = _tag, .type = RTW_IO_SNIFF_TYPE_VALUE,}
|
|
const struct rtw_io_sniff_ent read_sniff[] = {
|
#ifdef DBG_IO_HCI_EN_CHK
|
RTW_IO_SNIFF_EN_ENT(CHIP_WIFI6_MAX, RTW_HCI_SDIO, 0x02, 0x1FC, 1, "SDIO 0x02[8:2] not all 0"),
|
RTW_IO_SNIFF_EN_ENT(CHIP_WIFI6_MAX, RTW_HCI_USB, 0x02, 0x1E0, 1, "USB 0x02[8:5] not all 0"),
|
RTW_IO_SNIFF_EN_ENT(CHIP_WIFI6_MAX, RTW_HCI_PCIE, 0x02, 0x01C, 1, "PCI 0x02[4:2] not all 0"),
|
#endif
|
#ifdef DBG_IO_SNIFF_EXAMPLE
|
RTW_IO_SNIFF_RANGE_ENT(CHIP_WIFI6_MAX, 0, 0x522, 0x522, 0, "read TXPAUSE"),
|
RTW_IO_SNIFF_DIS_ENT(CHIP_WIFI6_MAX, 0, 0x02, 0x3, 0, "0x02[1:0] not all 1"),
|
#endif
|
};
|
|
const int read_sniff_num = sizeof(read_sniff) / sizeof(struct rtw_io_sniff_ent);
|
|
const struct rtw_io_sniff_ent write_sniff[] = {
|
#ifdef DBG_IO_HCI_EN_CHK
|
RTW_IO_SNIFF_EN_ENT(CHIP_WIFI6_MAX, RTW_HCI_SDIO, 0x02, 0x1FC, 1, "SDIO 0x02[8:2] not all 0"),
|
RTW_IO_SNIFF_EN_ENT(CHIP_WIFI6_MAX, RTW_HCI_SDIO, 0x02, 0x1E0, 1, "USB 0x02[8:5] not all 0"),
|
RTW_IO_SNIFF_EN_ENT(CHIP_WIFI6_MAX, RTW_HCI_SDIO, 0x02, 0x01C, 1, "PCI 0x02[4:2] not all 0"),
|
#endif
|
#ifdef DBG_IO_SNIFF_EXAMPLE
|
RTW_IO_SNIFF_RANGE_ENT(CHIP_WIFI6_MAX, 0, 0x522, 0x522, 0, "write TXPAUSE"),
|
RTW_IO_SNIFF_DIS_ENT(CHIP_WIFI6_MAX, 0, 0x02, 0x3, 0, "0x02[1:0] not all 1"),
|
#endif
|
};
|
|
const int write_sniff_num = sizeof(write_sniff) / sizeof(struct rtw_io_sniff_ent);
|
|
static bool match_io_sniff_ranges(struct rtw_hal_com_t *hal
|
, const struct rtw_io_sniff_ent *sniff, int i, u32 addr, u16 len)
|
{
|
|
/* check if IO range after sniff end address */
|
if (addr > sniff->u.end_addr)
|
return 0;
|
|
return 1;
|
}
|
|
static bool match_io_sniff_value(struct rtw_hal_com_t *hal
|
, const struct rtw_io_sniff_ent *sniff, int i, u32 addr, u8 len, u32 val)
|
{
|
u8 sniff_len;
|
s8 mask_shift;
|
u32 mask;
|
s8 value_shift;
|
u32 value;
|
bool ret = 0;
|
|
/* check if IO range after sniff end address */
|
sniff_len = 4;
|
while (!(sniff->u.vm.mask & (0xFF << ((sniff_len - 1) * 8)))) {
|
sniff_len--;
|
if (sniff_len == 0)
|
goto exit;
|
}
|
if (sniff->addr + sniff_len <= addr)
|
goto exit;
|
|
/* align to IO addr */
|
mask_shift = (sniff->addr - addr) * 8;
|
value_shift = mask_shift + bitshift(sniff->u.vm.mask);
|
if (mask_shift > 0)
|
mask = sniff->u.vm.mask << mask_shift;
|
else if (mask_shift < 0)
|
mask = sniff->u.vm.mask >> -mask_shift;
|
else
|
mask = sniff->u.vm.mask;
|
|
if (value_shift > 0)
|
value = sniff->u.vm.val << value_shift;
|
else if (mask_shift < 0)
|
value = sniff->u.vm.val >> -value_shift;
|
else
|
value = sniff->u.vm.val;
|
|
if ((sniff->u.vm.equal && (mask & val) == (mask & value))
|
|| (!sniff->u.vm.equal && (mask & val) != (mask & value))
|
) {
|
ret = 1;
|
if (0)
|
PHL_INFO(" addr:0x%x len:%u val:0x%x (i:%d sniff_len:%u m_shift:%d mask:0x%x v_shifd:%d value:0x%x equal:%d)\n"
|
, addr, len, val, i, sniff_len, mask_shift, mask, value_shift, value, sniff->u.vm.equal);
|
}
|
|
exit:
|
return ret;
|
}
|
|
static bool match_io_sniff(struct rtw_hal_com_t *hal
|
, const struct rtw_io_sniff_ent *sniff, int i, u32 addr, u8 len, u32 val)
|
{
|
bool ret = 0;
|
|
if (sniff->chip != CHIP_WIFI6_MAX
|
&& sniff->chip != hal_get_chip_id(hal))
|
goto exit;
|
/*
|
if (sniff->hci
|
&& !(sniff->hci & hal_get_hci_type(hal)))
|
goto exit;
|
*/
|
if (sniff->addr >= addr + len) /* IO range below sniff start address */
|
goto exit;
|
|
switch (sniff->type) {
|
case RTW_IO_SNIFF_TYPE_RANGE:
|
ret = match_io_sniff_ranges(hal, sniff, i, addr, len);
|
break;
|
case RTW_IO_SNIFF_TYPE_VALUE:
|
if (len == 1 || len == 2 || len == 4)
|
ret = match_io_sniff_value(hal, sniff, i, addr, len, val);
|
break;
|
default:
|
/*_os_warn_on(1);*/
|
break;
|
}
|
|
exit:
|
return ret;
|
}
|
|
u32 match_read_sniff(struct rtw_hal_com_t *hal, u32 addr, u16 len, u32 val)
|
{
|
int i;
|
bool trace = 0;
|
u32 match = 0;
|
|
for (i = 0; i < read_sniff_num; i++) {
|
if (match_io_sniff(hal, &read_sniff[i], i, addr, len, val)) {
|
match++;
|
trace |= read_sniff[i].trace;
|
if (read_sniff[i].tag)
|
PHL_INFO("DBG_IO TAG %s\n", read_sniff[i].tag);
|
}
|
}
|
|
/*_os_warn_on(trace);*/
|
|
return match;
|
}
|
|
u32 match_write_sniff(struct rtw_hal_com_t *hal, u32 addr, u16 len, u32 val)
|
{
|
int i;
|
bool trace = 0;
|
u32 match = 0;
|
|
for (i = 0; i < write_sniff_num; i++) {
|
if (match_io_sniff(hal, &write_sniff[i], i, addr, len, val)) {
|
match++;
|
trace |= write_sniff[i].trace;
|
if (write_sniff[i].tag)
|
PHL_INFO("DBG_IO TAG %s\n", write_sniff[i].tag);
|
}
|
}
|
|
/*_os_warn_on(trace);*/
|
|
return match;
|
}
|
|
struct rf_sniff_ent {
|
u8 path;
|
u16 reg;
|
u32 mask;
|
};
|
|
struct rf_sniff_ent rf_read_sniff_ranges[] = {
|
/* example for all path addr 0x55 with all RF Reg mask */
|
/* {MAX_RF_PATH, 0x55, bRFRegOffsetMask}, */
|
};
|
|
struct rf_sniff_ent rf_write_sniff_ranges[] = {
|
/* example for all path addr 0x55 with all RF Reg mask */
|
/* {MAX_RF_PATH, 0x55, bRFRegOffsetMask}, */
|
};
|
|
int rf_read_sniff_num = sizeof(rf_read_sniff_ranges) / sizeof(struct rf_sniff_ent);
|
int rf_write_sniff_num = sizeof(rf_write_sniff_ranges) / sizeof(struct rf_sniff_ent);
|
|
bool match_rf_read_sniff_ranges(struct rtw_hal_com_t *hal, u8 path, u32 addr, u32 mask)
|
{
|
int i;
|
|
for (i = 0; i < rf_read_sniff_num; i++) {
|
if (rf_read_sniff_ranges[i].path == MAX_RF_PATH ||
|
rf_read_sniff_ranges[i].path == path)
|
if ((addr == rf_read_sniff_ranges[i].reg) &&
|
(mask & rf_read_sniff_ranges[i].mask))
|
return true;
|
}
|
|
return false;
|
}
|
|
bool match_rf_write_sniff_ranges(struct rtw_hal_com_t *hal,
|
u8 path, u32 addr, u32 mask)
|
{
|
int i;
|
|
for (i = 0; i < rf_write_sniff_num; i++) {
|
if (rf_write_sniff_ranges[i].path == MAX_RF_PATH ||
|
rf_write_sniff_ranges[i].path == path)
|
if ((addr == rf_write_sniff_ranges[i].reg) &&
|
(mask & rf_write_sniff_ranges[i].mask))
|
return true;
|
}
|
|
return false;
|
}
|
|
u8 dbg_hal_read8(struct rtw_hal_com_t *hal, u32 addr, const char *caller, const int line)
|
{
|
u8 val = _hal_read8(hal, addr);
|
|
if (match_read_sniff(hal, addr, 1, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_read8(0x%04x) return 0x%02x\n"
|
, caller, line, addr, val);
|
}
|
|
return val;
|
}
|
|
u16 dbg_hal_read16(struct rtw_hal_com_t *hal, u32 addr, const char *caller, const int line)
|
{
|
u16 val = _hal_read16(hal, addr);
|
|
if (match_read_sniff(hal, addr, 2, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_read16(0x%04x) return 0x%04x\n"
|
, caller, line, addr, val);
|
}
|
|
return val;
|
}
|
|
u32 dbg_hal_read32(struct rtw_hal_com_t *hal, u32 addr, const char *caller, const int line)
|
{
|
u32 val = _hal_read32(hal, addr);
|
|
if (match_read_sniff(hal, addr, 4, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_read32(0x%04x) return 0x%08x\n"
|
, caller, line, addr, val);
|
}
|
|
return val;
|
}
|
|
int dbg_hal_write8(struct rtw_hal_com_t *hal, u32 addr, u8 val, const char *caller, const int line)
|
{
|
if (match_write_sniff(hal, addr, 1, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_write8(0x%04x, 0x%02x)\n"
|
, caller, line, addr, val);
|
}
|
|
return _hal_write8(hal, addr, val);
|
}
|
int dbg_hal_write16(struct rtw_hal_com_t *hal, u32 addr, u16 val, const char *caller, const int line)
|
{
|
if (match_write_sniff(hal, addr, 2, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_write16(0x%04x, 0x%04x)\n"
|
, caller, line, addr, val);
|
}
|
|
return _hal_write16(hal, addr, val);
|
}
|
int dbg_hal_write32(struct rtw_hal_com_t *hal, u32 addr, u32 val, const char *caller, const int line)
|
{
|
if (match_write_sniff(hal, addr, 4, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_write32(0x%04x, 0x%08x)\n"
|
, caller, line, addr, val);
|
}
|
|
return _hal_write32(hal, addr, val);
|
}
|
|
#ifdef CONFIG_SDIO_HCI
|
u8 dbg_hal_sd_f0_read8(struct rtw_hal_com_t *hal, u32 addr, const char *caller, const int line)
|
{
|
u8 val = _hal_sd_f0_read8(hal, addr);
|
|
#if 0
|
if (match_read_sniff(adapter, addr, 1, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_sd_f0_read8(0x%04x) return 0x%02x\n"
|
, caller, line, addr, val);
|
}
|
#endif
|
|
return val;
|
}
|
|
#ifdef CONFIG_SDIO_INDIRECT_ACCESS
|
u8 dbg_hal_sd_iread8(struct rtw_hal_com_t *hal, u32 addr, const char *caller, const int line)
|
{
|
u8 val = hal_sd_iread8(hal, addr);
|
|
if (match_read_sniff(hal, addr, 1, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_sd_iread8(0x%04x) return 0x%02x\n"
|
, caller, line, addr, val);
|
}
|
|
return val;
|
}
|
|
u16 dbg_hal_sd_iread16(struct rtw_hal_com_t *hal, u32 addr, const char *caller, const int line)
|
{
|
u16 val = _hal_sd_iread16(hal, addr);
|
|
if (match_read_sniff(hal, addr, 2, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_sd_iread16(0x%04x) return 0x%04x\n"
|
, caller, line, addr, val);
|
}
|
|
return val;
|
}
|
|
u32 dbg_hal_sd_iread32(struct rtw_hal_com_t *hal, u32 addr, const char *caller, const int line)
|
{
|
u32 val = _hal_sd_iread32(hal, addr);
|
|
if (match_read_sniff(hal, addr, 4, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_sd_iread32(0x%04x) return 0x%08x\n"
|
, caller, line, addr, val);
|
}
|
|
return val;
|
}
|
|
int dbg_hal_sd_iwrite8(struct rtw_hal_com_t *hal, u32 addr, u8 val, const char *caller, const int line)
|
{
|
if (match_write_sniff(hal, addr, 1, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_sd_iwrite8(0x%04x, 0x%02x)\n"
|
, caller, line, addr, val);
|
}
|
|
return _hal_sd_iwrite8(hal, addr, val);
|
}
|
int dbg_hal_sd_iwrite16(struct rtw_hal_com_t *hal, u32 addr, u16 val, const char *caller, const int line)
|
{
|
if (match_write_sniff(hal, addr, 2, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_sd_iwrite16(0x%04x, 0x%04x)\n"
|
, caller, line, addr, val);
|
}
|
|
return _hal_sd_iwrite16(hal, addr, val);
|
}
|
int dbg_hal_sd_iwrite32(struct rtw_hal_com_t *hal, u32 addr, u32 val, const char *caller, const int line)
|
{
|
if (match_write_sniff(hal, addr, 4, val)) {
|
PHL_INFO("DBG_IO %s:%d hal_sd_iwrite32(0x%04x, 0x%08x)\n"
|
, caller, line, addr, val);
|
}
|
|
return _hal_sd_iwrite32(hal, addr, val);
|
}
|
|
#endif /* CONFIG_SDIO_INDIRECT_ACCESS */
|
|
#endif /* CONFIG_SDIO_HCI */
|
#endif
|