hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/******************************************************************************
 *
 * 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;
}