/****************************************************************************** * * 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_8822c_cfg.h" #include "halmac_common_8822c.h" #include "../halmac_common_88xx.h" #if HALMAC_SDIO_SUPPORT #include "halmac_sdio_8822c.h" #endif #include "halmac_cfg_wmac_8822c.h" #if HALMAC_PCIE_SUPPORT #include "halmac_pcie_8822c.h" #endif #if HALMAC_8822C_SUPPORT static void cfg_ldo25_8822c(struct halmac_adapter *adapter, u8 enable); /** * get_hw_value_8822c() -get hw config value * @adapter : the adapter of halmac * @hw_id : hw id for driver to query * @value : hw value, reference table to get data type * 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 get_hw_value_8822c(struct halmac_adapter *adapter, enum halmac_hw_id hw_id, void *value) { enum halmac_ret_status status = HALMAC_RET_SUCCESS; PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__); if (!value) { PLTFM_MSG_ERR("[ERR]%s (NULL ==value)\n", __func__); return HALMAC_RET_NULL_POINTER; } if (get_hw_value_88xx(adapter, hw_id, value) == HALMAC_RET_SUCCESS) return HALMAC_RET_SUCCESS; switch (hw_id) { case HALMAC_HW_FW_MAX_SIZE: *(u32 *)value = WLAN_FW_MAX_SIZE_8822C; break; #if HALMAC_SDIO_SUPPORT case HALMAC_HW_SDIO_INT_LAT: if (adapter->intf != HALMAC_INTERFACE_SDIO) return HALMAC_RET_WRONG_INTF; *(u32 *)value = get_sdio_int_lat_8822c(adapter); break; case HALMAC_HW_SDIO_CLK_CNT: if (adapter->intf != HALMAC_INTERFACE_SDIO) return HALMAC_RET_WRONG_INTF; status = get_sdio_clk_cnt_8822c(adapter, (u32 *)value); break; #endif default: return HALMAC_RET_PARA_NOT_SUPPORT; } PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__); return status; } /** * set_hw_value_8822c() -set hw config value * @adapter : the adapter of halmac * @hw_id : hw id for driver to config * @value : hw value, reference table to get data type * 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 set_hw_value_8822c(struct halmac_adapter *adapter, enum halmac_hw_id hw_id, void *value) { enum halmac_ret_status status = HALMAC_RET_SUCCESS; PLTFM_MSG_TRACE("[TRACE]%s ===>\n", __func__); if (!value) { PLTFM_MSG_ERR("[ERR]null pointer\n"); return HALMAC_RET_NULL_POINTER; } if (set_hw_value_88xx(adapter, hw_id, value) == HALMAC_RET_SUCCESS) return HALMAC_RET_SUCCESS; switch (hw_id) { case HALMAC_HW_AMPDU_CONFIG: cfg_ampdu_8822c(adapter, (struct halmac_ampdu_config *)value); break; case HALMAC_HW_RXGCK_FIFO: cfg_rxgck_fifo_8822c(adapter, *(u8 *)value); break; case HALMAC_HW_RX_IGNORE: cfg_rx_ignore_8822c(adapter, (struct halmac_mac_rx_ignore_cfg *)value); break; case HALMAC_HW_LDO25_EN: cfg_ldo25_8822c(adapter, *(u8 *)value); break; #if HALMAC_PCIE_SUPPORT case HALMAC_HW_PCIE_REF_AUTOK: if (adapter->intf != HALMAC_INTERFACE_PCIE) return HALMAC_RET_WRONG_INTF; status = auto_refclk_cal_8822c_pcie(adapter); if (status != HALMAC_RET_SUCCESS) return status; break; #endif #if HALMAC_SDIO_SUPPORT case HALMAC_HW_SDIO_TX_FORMAT: if (adapter->intf != HALMAC_INTERFACE_SDIO) return HALMAC_RET_WRONG_INTF; status = cfg_tx_fmt_sdio_8822c(adapter, *(enum halmac_sdio_tx_format *)value); break; case HALMAC_HW_SDIO_WT_EN: if (adapter->intf != HALMAC_INTERFACE_SDIO) return HALMAC_RET_WRONG_INTF; status = set_sdio_wt_en_8822c(adapter, 1); break; case HALMAC_HW_SDIO_CLK_MONITOR: if (adapter->intf != HALMAC_INTERFACE_SDIO) return HALMAC_RET_WRONG_INTF; status = set_sdio_clk_mon_8822c(adapter, *(enum halmac_sdio_clk_monitor *)value); break; #endif default: return HALMAC_RET_PARA_NOT_SUPPORT; } PLTFM_MSG_TRACE("[TRACE]%s <===\n", __func__); return status; } /** * halmac_fill_txdesc_check_sum_88xx() - fill in tx desc check sum * @adapter : the adapter of halmac * @txdesc : tx desc packet * 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 fill_txdesc_check_sum_8822c(struct halmac_adapter *adapter, u8 *txdesc) { __le16 chksum = 0; u16 txdesc_size; __le16 *data; u32 i; if (!txdesc) { PLTFM_MSG_ERR("[ERR]null pointer\n"); return HALMAC_RET_NULL_POINTER; } if (adapter->tx_desc_checksum != 1) PLTFM_MSG_TRACE("[TRACE]chksum disable\n"); SET_TX_DESC_TXDESC_CHECKSUM(txdesc, 0x0000); data = (u16 *)(txdesc); /*unit: 4 Bytes*/ txdesc_size = (u16)((GET_TX_DESC_PKT_OFFSET(txdesc) + (TX_DESC_SIZE_88XX >> 3)) << 1); for (i = 0; i < txdesc_size; i++) chksum ^= (*(data + 2 * i) ^ *(data + (2 * i + 1))); /* *(data + 2 * i) & *(data + (2 * i + 1) have endain issue*/ /* Process eniadn issue after checksum calculation */ SET_TX_DESC_TXDESC_CHECKSUM(txdesc, rtk_le16_to_cpu(chksum)); return HALMAC_RET_SUCCESS; } static void cfg_ldo25_8822c(struct halmac_adapter *adapter, u8 enable) { u8 value8; struct halmac_api *api = (struct halmac_api *)adapter->halmac_api; value8 = HALMAC_REG_R8(REG_ANAPARLDO_POW_MAC); if (enable == 1) HALMAC_REG_W8(REG_ANAPARLDO_POW_MAC, (u8)(value8 | BIT(0))); else HALMAC_REG_W8(REG_ANAPARLDO_POW_MAC, (u8)(value8 & ~BIT(0))); } #endif /* HALMAC_8822C_SUPPORT */