/******************************************************************************
|
*
|
* 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.
|
*
|
*****************************************************************************/
|
#define _HAL_TRX_MIT_C_
|
#include "hal_headers.h"
|
|
static void
|
_hal_trx_mit_timer_convert(u32 timer, u8 *mul_ptr,
|
enum mac_ax_trx_mitigation_timer_unit *unit_ptr)
|
{
|
/* timer = mul * unit */
|
|
const enum mac_ax_trx_mitigation_timer_unit UNIT_ARR[] = {
|
MAC_AX_MIT_64US, MAC_AX_MIT_128US, MAC_AX_MIT_256US,
|
MAC_AX_MIT_512US};
|
const u8 UNIT_EXP_ARR[] = {6, 7, 8, 9}; /* 2^exp = unit */
|
const u8 UNIT_ARR_LEN = 4;
|
|
const u8 MUL_MAX = 0xff; /* 8 bits for mul */
|
|
u32 timer_ = 0;
|
u8 idx;
|
|
for (idx = 0; idx < UNIT_ARR_LEN; idx++) {
|
|
timer_ = timer >> UNIT_EXP_ARR[idx];
|
|
if (timer_ <= MUL_MAX)
|
break;
|
}
|
|
if (timer_ > MUL_MAX)
|
*mul_ptr = MUL_MAX;
|
else
|
*mul_ptr = (u8)timer_;
|
|
if (idx < UNIT_ARR_LEN)
|
*unit_ptr = UNIT_ARR[idx];
|
else
|
*unit_ptr = UNIT_ARR[UNIT_ARR_LEN - 1];
|
}
|
|
enum rtw_hal_status rtw_hal_pcie_trx_mit(void *hal, u32 tx_timer, u8 tx_counter,
|
u32 rx_timer, u8 rx_counter)
|
{
|
struct hal_info_t *hal_info = (struct hal_info_t *)hal;
|
|
struct mac_ax_pcie_trx_mitigation mit_info;
|
struct mac_ax_txdma_ch_map txch_map;
|
struct mac_ax_rxdma_ch_map rxch_map;
|
|
/* tx */
|
|
txch_map.ch0 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch1 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch2 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch3 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch4 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch5 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch6 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch7 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch8 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch9 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch10 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch11 = MAC_AX_PCIE_DISABLE;
|
txch_map.ch12 = MAC_AX_PCIE_DISABLE;
|
|
mit_info.txch_map = &txch_map;
|
mit_info.tx_counter = tx_counter;
|
|
_hal_trx_mit_timer_convert(tx_timer, &(mit_info.tx_timer),
|
&(mit_info.tx_timer_unit));
|
|
PHL_INFO(
|
"%s :: mit_info.tx_timer == %d, mit_info.tx_timer_unit == %d\n",
|
__func__, mit_info.tx_timer, mit_info.tx_timer_unit);
|
|
/* tx - END */
|
|
/* rx */
|
|
rxch_map.rxq = MAC_AX_PCIE_ENABLE;
|
rxch_map.rpq = MAC_AX_PCIE_ENABLE;
|
|
mit_info.rxch_map = &rxch_map;
|
mit_info.rx_counter = rx_counter;
|
|
_hal_trx_mit_timer_convert(rx_timer, &(mit_info.rx_timer),
|
&(mit_info.rx_timer_unit));
|
|
PHL_INFO(
|
"%s :: mit_info.rx_timer == %d, mit_info.rx_timer_unit == %d\n",
|
__func__, mit_info.rx_timer, mit_info.rx_timer_unit);
|
|
/* rx - END */
|
|
if (rtw_hal_mac_pcie_trx_mit(hal_info, &mit_info) !=
|
RTW_HAL_STATUS_SUCCESS) {
|
|
PHL_INFO(
|
"%s :: failed to config pcie trx interrupt mitigation\n",
|
__func__);
|
return RTW_HAL_STATUS_FAILURE;
|
}
|
|
return RTW_HAL_STATUS_SUCCESS;
|
}
|