/****************************************************************************** * * Copyright(c) 2019 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. * ******************************************************************************/ #include "status.h" u32 mac_get_ft_status(struct mac_ax_adapter *adapter, enum mac_ax_feature mac_ft, enum mac_ax_status *stat, u8 *buf, const u32 size, u32 *ret_size) { struct mac_ax_ft_status *ft_stat; ft_stat = mac_get_ft(adapter, mac_ft); if (!ft_stat) return MACNOITEM; if (!buf) return MACNPTR; *stat = ft_stat->status; if (ft_stat->size) { if (size < ft_stat->size) return MACNOBUF; PLTFM_MEMCMP(buf, ft_stat->buf, ft_stat->size); *ret_size = ft_stat->size; } return MACSUCCESS; } struct mac_ax_ft_status *mac_get_ft(struct mac_ax_adapter *adapter, enum mac_ax_feature mac_ft) { struct mac_ax_ft_status *ft_stat = adapter->ft_stat; for (; ft_stat->mac_ft != MAC_AX_FT_MAX; ft_stat++) { if (ft_stat->mac_ft == mac_ft) return ft_stat; } PLTFM_MSG_ERR("The mac feature is not supported\n"); return NULL; } u32 set_hw_ch_busy_cnt(struct mac_ax_adapter *adapter, struct mac_ax_ch_busy_cnt_cfg *cfg) { u8 band; u32 ret; u32 reg_addr; struct mac_ax_intf_ops *ops = adapter_to_intf_ops(adapter); u32 val32; band = cfg->band; reg_addr = (band ? R_AX_PTCL_ATM_C1 : R_AX_PTCL_ATM); ret = check_mac_en(adapter, band, MAC_AX_CMAC_SEL); if (ret != MACSUCCESS) return ret; switch (cfg->cnt_ctrl) { case MAC_AX_CH_BUSY_CNT_CTRL_CNT_EN: MAC_REG_W32(reg_addr, MAC_REG_R32(reg_addr) | B_AX_CHNL_INFO_EN); break; case MAC_AX_CH_BUSY_CNT_CTRL_CNT_DIS: MAC_REG_W32(reg_addr, MAC_REG_R32(reg_addr) & ~B_AX_CHNL_INFO_EN); break; case MAC_AX_CH_BUSY_CNT_CTRL_CNT_BUSY_RST: val32 = MAC_REG_R32(reg_addr); MAC_REG_W32(reg_addr, val32 | B_AX_RST_CHNL_BUSY); MAC_REG_W32(reg_addr, val32 & ~B_AX_RST_CHNL_BUSY); break; case MAC_AX_CH_BUSY_CNT_CTRL_CNT_IDLE_RST: val32 = MAC_REG_R32(reg_addr); MAC_REG_W32(reg_addr, val32 | B_AX_RST_CHNL_IDLE); MAC_REG_W32(reg_addr, val32 & ~B_AX_RST_CHNL_IDLE); break; case MAC_AX_CH_BUSY_CNT_CTRL_CNT_RST: val32 = MAC_REG_R32(reg_addr); MAC_REG_W32(reg_addr, val32 | (B_AX_RST_CHNL_IDLE | B_AX_RST_CHNL_BUSY)); MAC_REG_W32(reg_addr, val32 & ~(B_AX_RST_CHNL_IDLE | B_AX_RST_CHNL_BUSY)); break; case MAC_AX_CH_BUSY_CNT_CTRL_CNT_REF: val32 = MAC_REG_R32(reg_addr) & ~(B_AX_CHNL_REF_RX_BASIC_NAV | B_AX_CHNL_REF_RX_INTRA_NAV | B_AX_CHNL_REF_DATA_ON | B_AX_CHNL_REF_EDCCA_P20 | B_AX_CHNL_REF_CCA_P20 | B_AX_CHNL_REF_CCA_S20 | B_AX_CHNL_REF_CCA_S40 | B_AX_CHNL_REF_CCA_S80 | B_AX_CHNL_REF_PHY_TXON); val32 |= (cfg->ref.basic_nav ? B_AX_CHNL_REF_RX_BASIC_NAV : 0) | (cfg->ref.intra_nav ? B_AX_CHNL_REF_RX_INTRA_NAV : 0) | (cfg->ref.data_on ? B_AX_CHNL_REF_DATA_ON : 0) | (cfg->ref.edcca_p20 ? B_AX_CHNL_REF_EDCCA_P20 : 0) | (cfg->ref.cca_p20 ? B_AX_CHNL_REF_CCA_P20 : 0) | (cfg->ref.cca_s20 ? B_AX_CHNL_REF_CCA_S20 : 0) | (cfg->ref.cca_s40 ? B_AX_CHNL_REF_CCA_S40 : 0) | (cfg->ref.cca_s80 ? B_AX_CHNL_REF_CCA_S80 : 0) | (cfg->ref.phy_txon ? B_AX_CHNL_REF_PHY_TXON : 0); MAC_REG_W32(reg_addr, val32); break; default: return MACNOITEM; } return MACSUCCESS; } u32 get_hw_ch_stat_cnt(struct mac_ax_adapter *adapter, struct mac_ax_ch_stat_cnt *cnt) { struct mac_ax_intf_ops *ops = adapter_to_intf_ops(adapter); u8 band; u32 ret; band = cnt->band; ret = check_mac_en(adapter, band, MAC_AX_CMAC_SEL); if (ret != MACSUCCESS) return ret; cnt->busy_cnt = MAC_REG_R32(band ? R_AX_CHNL_BUSY_TIME_0_C1 : R_AX_CHNL_BUSY_TIME_0); cnt->idle_cnt = MAC_REG_R32(band ? R_AX_CHNL_IDLE_TIME_0_C1 : R_AX_CHNL_IDLE_TIME_0); return MACSUCCESS; }