/****************************************************************************** * * Copyright(c) 2017 - 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 "halmac_cfg_wmac_8822c.h" #if HALMAC_8822C_SUPPORT /** * cfg_drv_info_8822c() - config driver info * @adapter : the adapter of halmac * @drv_info : driver information selection * Author : KaiYuan Chang/Ivan Lin * Return : enum halmac_ret_status * More details of status code can be found in prototype document */ enum halmac_ret_status cfg_drv_info_8822c(struct halmac_adapter *adapter, enum halmac_drv_info drv_info) { u8 drv_info_size = 0; u8 phy_status_en = 0; u8 sniffer_en = 0; u8 plcp_hdr_en = 0; u32 value32; struct halmac_api *api = (struct halmac_api *)adapter->halmac_api; struct halmac_rx_ignore_info *info = &adapter->rx_ignore_info; struct halmac_mac_rx_ignore_cfg cfg; PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__); PLTFM_MSG_TRACE("[TRACE]drv info = %d\n", drv_info); switch (drv_info) { case HALMAC_DRV_INFO_NONE: drv_info_size = 0; phy_status_en = 0; sniffer_en = 0; plcp_hdr_en = 0; info->hdr_chk_mask = 1; info->fcs_chk_mask = 1; break; case HALMAC_DRV_INFO_PHY_STATUS: drv_info_size = 4; phy_status_en = 1; sniffer_en = 0; plcp_hdr_en = 0; info->hdr_chk_mask = 1; info->fcs_chk_mask = 1; break; case HALMAC_DRV_INFO_PHY_SNIFFER: drv_info_size = 5; /* phy status 4byte, sniffer info 1byte */ phy_status_en = 1; sniffer_en = 1; plcp_hdr_en = 0; info->hdr_chk_mask = 0; info->fcs_chk_mask = 0; break; case HALMAC_DRV_INFO_PHY_PLCP: drv_info_size = 6; /* phy status 4byte, plcp header 2byte */ phy_status_en = 1; sniffer_en = 0; plcp_hdr_en = 1; info->hdr_chk_mask = 0; info->fcs_chk_mask = 0; break; default: return HALMAC_RET_SW_CASE_NOT_SUPPORT; } cfg.hdr_chk_en = info->hdr_chk_en; cfg.fcs_chk_en = info->fcs_chk_en; cfg.cck_rst_en = info->cck_rst_en; cfg.fcs_chk_thr = info->fcs_chk_thr; api->halmac_set_hw_value(adapter, HALMAC_HW_RX_IGNORE, &cfg); HALMAC_REG_W8(REG_RX_DRVINFO_SZ, drv_info_size); adapter->drv_info_size = drv_info_size; value32 = HALMAC_REG_R32(REG_RCR); value32 = (value32 & (~BIT_APP_PHYSTS)); if (phy_status_en == 1) value32 = value32 | BIT_APP_PHYSTS; HALMAC_REG_W32(REG_RCR, value32); value32 = HALMAC_REG_R32(REG_WMAC_OPTION_FUNCTION + 4); value32 = (value32 & (~(BIT(8) | BIT(9)))); if (sniffer_en == 1) value32 = value32 | BIT(9); if (plcp_hdr_en == 1) value32 = value32 | BIT(8); HALMAC_REG_W32(REG_WMAC_OPTION_FUNCTION + 4, value32); PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__); return HALMAC_RET_SUCCESS; } /** * init_low_pwr_8822c() - config WMAC register * @adapter * Author : KaiYuan Chang/Ivan Lin * Return : enum halmac_ret_status * More details of status code can be found in prototype document */ enum halmac_ret_status init_low_pwr_8822c(struct halmac_adapter *adapter) { u16 value16; struct halmac_api *api = (struct halmac_api *)adapter->halmac_api; PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__); /*RXGCK FIFO threshold CFG*/ value16 = (HALMAC_REG_R16(REG_RXPSF_CTRL + 2) & 0xF00F); value16 |= BIT(10) | BIT(8) | BIT(6) | BIT(4); HALMAC_REG_W16(REG_RXPSF_CTRL + 2, value16); /*invalid_pkt CFG*/ value16 = 0; value16 = BIT_SET_RXPSF_PKTLENTHR(value16, 1); value16 |= BIT_RXPSF_CTRLEN | BIT_RXPSF_VHTCHKEN | BIT_RXPSF_HTCHKEN | BIT_RXPSF_OFDMCHKEN | BIT_RXPSF_CCKCHKEN | BIT_RXPSF_OFDMRST; HALMAC_REG_W16(REG_RXPSF_CTRL, value16); HALMAC_REG_W32(REG_RXPSF_TYPE_CTRL, 0xFFFFFFFF); PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__); return HALMAC_RET_SUCCESS; } void cfg_rxgck_fifo_8822c(struct halmac_adapter *adapter, u8 enable) { struct halmac_api *api = (struct halmac_api *)adapter->halmac_api; if (enable == 1) { if (adapter->hw_cfg_info.trx_mode != HALMAC_TRNSFER_NORMAL) PLTFM_MSG_ERR("[ERR]trx_mode != normal\n"); else HALMAC_REG_W8_SET(REG_RXPSF_CTRL + 3, BIT(4)); } else { HALMAC_REG_W8_CLR(REG_RXPSF_CTRL + 3, BIT(4)); } } void cfg_rx_ignore_8822c(struct halmac_adapter *adapter, struct halmac_mac_rx_ignore_cfg *cfg) { u16 value16; struct halmac_rx_ignore_info *info = &adapter->rx_ignore_info; struct halmac_api *api = (struct halmac_api *)adapter->halmac_api; PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__); value16 = HALMAC_REG_R16(REG_RXPSF_CTRL); info->hdr_chk_en = cfg->hdr_chk_en; info->fcs_chk_en = cfg->fcs_chk_en; info->cck_rst_en = cfg->cck_rst_en; info->fcs_chk_thr = cfg->fcs_chk_thr; /*mac header check enable*/ if (cfg->hdr_chk_en == 1 && info->hdr_chk_mask == 1) value16 |= BIT_RXPSF_MHCHKEN; else value16 &= ~(BIT_RXPSF_MHCHKEN); /*continuous FCS error counter enable*/ if (cfg->fcs_chk_en == 1 && info->fcs_chk_mask == 1) value16 |= BIT_RXPSF_CONT_ERRCHKEN; else value16 &= ~(BIT_RXPSF_CONT_ERRCHKEN); /*MAC Rx reset when CCK enable*/ if (cfg->cck_rst_en == 1) value16 |= BIT_RXPSF_CCKRST; else value16 &= ~(BIT_RXPSF_CCKRST); /*FCS error counter threshold*/ value16 = BIT_SET_RXPSF_ERRTHR(value16, cfg->fcs_chk_thr); HALMAC_REG_W16(REG_RXPSF_CTRL, value16); PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__); } void cfg_ampdu_8822c(struct halmac_adapter *adapter, struct halmac_ampdu_config *cfg) { u32 ht_max_len; u32 vht_max_len; struct halmac_api *api = (struct halmac_api *)adapter->halmac_api; HALMAC_REG_W8(REG_PROT_MODE_CTRL + 2, cfg->max_agg_num); HALMAC_REG_W8(REG_PROT_MODE_CTRL + 3, cfg->max_agg_num); if (cfg->max_len_en == 1) { ht_max_len = cfg->ht_max_len & 0xFFFF; vht_max_len = cfg->vht_max_len & 0xFFFFF; HALMAC_REG_W32(REG_AMPDU_MAX_LENGTH_HT, ht_max_len); HALMAC_REG_W32(REG_AMPDU_MAX_LENGTH_VHT, vht_max_len); } } #endif /* HALMAC_8822C_SUPPORT */