Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/led/hal_led.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2017 Realtek Corporation.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
*****************************************************************************/
15
16
#include <drv_types.h>
17
#include <hal_data.h>
18
19
#ifdef CONFIG_RTW_LED
20
void dump_led_config(void *sel, _adapter *adapter)
21
{
22
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
23
struct led_priv *ledpriv = adapter_to_led(adapter);
24
int i;
25
26
RTW_PRINT_SEL(sel, "strategy:%u\n", ledpriv->LedStrategy);
27
#ifdef CONFIG_RTW_SW_LED
28
RTW_PRINT_SEL(sel, "bRegUseLed:%u\n", ledpriv->bRegUseLed);
29
RTW_PRINT_SEL(sel, "iface_en_mask:0x%02X\n", ledpriv->iface_en_mask);
30
for (i = 0; i < dvobj->iface_nums; i++)
31
RTW_PRINT_SEL(sel, "ctl_en_mask[%d]:0x%08X\n", i, ledpriv->ctl_en_mask[i]);
32
#endif
33
}
34
35
void rtw_led_set_strategy(_adapter *adapter, u8 strategy)
36
{
37
struct led_priv *ledpriv = adapter_to_led(adapter);
38
_adapter *pri_adapter = GET_PRIMARY_ADAPTER(adapter);
39
40
#ifndef CONFIG_RTW_SW_LED
41
if (IS_SW_LED_STRATEGY(strategy)) {
42
RTW_WARN("CONFIG_RTW_SW_LED is not defined\n");
43
return;
44
}
45
#endif
46
47
#ifdef CONFIG_RTW_SW_LED
48
if (!ledpriv->bRegUseLed)
49
return;
50
#endif
51
52
if (ledpriv->LedStrategy == strategy)
53
return;
54
55
if (IS_HW_LED_STRATEGY(strategy) || IS_HW_LED_STRATEGY(ledpriv->LedStrategy)) {
56
RTW_WARN("switching on/off HW_LED strategy is not supported\n");
57
return;
58
}
59
60
ledpriv->LedStrategy = strategy;
61
62
#ifdef CONFIG_RTW_SW_LED
63
rtw_hal_sw_led_deinit(pri_adapter);
64
#endif
65
66
rtw_led_control(pri_adapter, RTW_LED_OFF);
67
}
68
69
#ifdef CONFIG_RTW_SW_LED
70
#if CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY
71
void rtw_sw_led_blink_uc_trx_only(LED_DATA *led)
72
{
73
_adapter *adapter = led->padapter;
74
BOOLEAN bStopBlinking = _FALSE;
75
76
if (led->BlinkingLedState == RTW_LED_ON)
77
SwLedOn(adapter, led);
78
else
79
SwLedOff(adapter, led);
80
81
switch (led->CurrLedState) {
82
case RTW_LED_ON:
83
SwLedOn(adapter, led);
84
break;
85
86
case RTW_LED_OFF:
87
SwLedOff(adapter, led);
88
break;
89
90
case LED_BLINK_TXRX:
91
led->BlinkTimes--;
92
if (led->BlinkTimes == 0)
93
bStopBlinking = _TRUE;
94
95
if (adapter_to_pwrctl(adapter)->rf_pwrstate != rf_on
96
&& adapter_to_pwrctl(adapter)->rfoff_reason > RF_CHANGE_BY_PS
97
) {
98
SwLedOff(adapter, led);
99
led->bLedBlinkInProgress = _FALSE;
100
} else {
101
if (led->bLedOn)
102
led->BlinkingLedState = RTW_LED_OFF;
103
else
104
led->BlinkingLedState = RTW_LED_ON;
105
106
if (bStopBlinking) {
107
led->CurrLedState = RTW_LED_OFF;
108
led->bLedBlinkInProgress = _FALSE;
109
}
110
_set_timer(&(led->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
111
}
112
break;
113
114
default:
115
break;
116
}
117
}
118
119
void rtw_sw_led_ctl_mode_uc_trx_only(_adapter *adapter, LED_CTL_MODE ctl)
120
{
121
struct led_priv *ledpriv = adapter_to_led(adapter);
122
LED_DATA *led = &(ledpriv->SwLed0);
123
LED_DATA *led1 = &(ledpriv->SwLed1);
124
LED_DATA *led2 = &(ledpriv->SwLed2);
125
126
switch (ctl) {
127
case LED_CTL_UC_TX:
128
case LED_CTL_UC_RX:
129
if (led->bLedBlinkInProgress == _FALSE) {
130
led->bLedBlinkInProgress = _TRUE;
131
led->CurrLedState = LED_BLINK_TXRX;
132
led->BlinkTimes = 2;
133
if (led->bLedOn)
134
led->BlinkingLedState = RTW_LED_OFF;
135
else
136
led->BlinkingLedState = RTW_LED_ON;
137
_set_timer(&(led->BlinkTimer), LED_BLINK_FASTER_INTERVAL_ALPHA);
138
}
139
break;
140
141
case LED_CTL_POWER_OFF:
142
led->CurrLedState = RTW_LED_OFF;
143
led->BlinkingLedState = RTW_LED_OFF;
144
145
if (led->bLedBlinkInProgress) {
146
_cancel_timer_ex(&(led->BlinkTimer));
147
led->bLedBlinkInProgress = _FALSE;
148
}
149
150
SwLedOff(adapter, led);
151
SwLedOff(adapter, led1);
152
SwLedOff(adapter, led2);
153
break;
154
155
default:
156
break;
157
}
158
}
159
#endif /* CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY */
160
161
void rtw_led_control(_adapter *adapter, LED_CTL_MODE ctl)
162
{
163
struct led_priv *ledpriv = adapter_to_led(adapter);
164
165
if (ledpriv->LedControlHandler) {
166
#if CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY
167
if (ledpriv->LedStrategy != SW_LED_MODE_UC_TRX_ONLY) {
168
if (ctl == LED_CTL_UC_TX || ctl == LED_CTL_BMC_TX) {
169
if (ledpriv->ctl_en_mask[adapter->iface_id] & BIT(LED_CTL_TX))
170
ctl = LED_CTL_TX; /* transform specific TX ctl to general TX ctl */
171
} else if (ctl == LED_CTL_UC_RX || ctl == LED_CTL_BMC_RX) {
172
if (ledpriv->ctl_en_mask[adapter->iface_id] & BIT(LED_CTL_RX))
173
ctl = LED_CTL_RX; /* transform specific RX ctl to general RX ctl */
174
}
175
}
176
#endif
177
178
if ((ledpriv->iface_en_mask & BIT(adapter->iface_id))
179
&& (ledpriv->ctl_en_mask[adapter->iface_id] & BIT(ctl)))
180
ledpriv->LedControlHandler(adapter, ctl);
181
}
182
}
183
184
void rtw_led_tx_control(_adapter *adapter, const u8 *da)
185
{
186
#if CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY
187
if (IS_MCAST(da))
188
rtw_led_control(adapter, LED_CTL_BMC_TX);
189
else
190
rtw_led_control(adapter, LED_CTL_UC_TX);
191
#else
192
rtw_led_control(adapter, LED_CTL_TX);
193
#endif
194
}
195
196
void rtw_led_rx_control(_adapter *adapter, const u8 *da)
197
{
198
#if CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY
199
if (IS_MCAST(da))
200
rtw_led_control(adapter, LED_CTL_BMC_RX);
201
else
202
rtw_led_control(adapter, LED_CTL_UC_RX);
203
#else
204
rtw_led_control(adapter, LED_CTL_RX);
205
#endif
206
}
207
208
void rtw_led_set_iface_en(_adapter *adapter, u8 en)
209
{
210
struct led_priv *ledpriv = adapter_to_led(adapter);
211
212
if (en)
213
ledpriv->iface_en_mask |= BIT(adapter->iface_id);
214
else
215
ledpriv->iface_en_mask &= ~BIT(adapter->iface_id);
216
}
217
218
void rtw_led_set_iface_en_mask(_adapter *adapter, u8 mask)
219
{
220
struct led_priv *ledpriv = adapter_to_led(adapter);
221
222
ledpriv->iface_en_mask = mask;
223
}
224
225
void rtw_led_set_ctl_en_mask(_adapter *adapter, u32 ctl_mask)
226
{
227
struct led_priv *ledpriv = adapter_to_led(adapter);
228
229
#if CONFIG_RTW_SW_LED_TRX_DA_CLASSIFY
230
if (ctl_mask & BIT(LED_CTL_TX))
231
ctl_mask |= BIT(LED_CTL_UC_TX) | BIT(LED_CTL_BMC_TX);
232
if (ctl_mask & BIT(LED_CTL_RX))
233
ctl_mask |= BIT(LED_CTL_UC_RX) | BIT(LED_CTL_BMC_RX);
234
#endif
235
236
ledpriv->ctl_en_mask[adapter->iface_id] = ctl_mask;
237
}
238
239
void rtw_led_set_ctl_en_mask_primary(_adapter *adapter)
240
{
241
rtw_led_set_ctl_en_mask(adapter, 0xFFFFFFFF);
242
}
243
244
void rtw_led_set_ctl_en_mask_virtual(_adapter *adapter)
245
{
246
rtw_led_set_ctl_en_mask(adapter
247
, BIT(LED_CTL_POWER_ON) | BIT(LED_CTL_POWER_OFF)
248
| BIT(LED_CTL_TX) | BIT(LED_CTL_RX)
249
);
250
}
251
#endif /* CONFIG_RTW_SW_LED */
252
253
#endif /* CONFIG_RTW_LED */
254
255
256