3b0fe69fe60b796f38d79d76785cfa14c1c5c5f2
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8822be / hal / rtl8822b / rtl8822b_mac.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2015 - 2016 Realtek Corporation. All rights reserved.
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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #define _RTL8822B_MAC_C_
21
22 #include <drv_types.h>          /* PADAPTER, basic_types.h and etc. */
23 #include <hal_data.h>           /* HAL_DATA_TYPE */
24 #include "../hal_halmac.h"      /* Register Definition and etc. */
25
26
27 inline u8 rtl8822b_rcr_config(PADAPTER p, u32 rcr)
28 {
29         u32 v32;
30         int err;
31
32
33         v32 = GET_HAL_DATA(p)->ReceiveConfig;
34         v32 ^= rcr;
35         v32 &= BIT_APP_PHYSTS_8822B;
36         if (v32) {
37                 v32 = rcr & BIT_APP_PHYSTS_8822B;
38                 RTW_INFO("%s: runtime %s rx phy status!\n",
39                          __FUNCTION__, v32 ? "ENABLE" : "DISABLE");
40                 if (v32) {
41                         err = rtw_halmac_config_rx_info(adapter_to_dvobj(p), HALMAC_DRV_INFO_PHY_STATUS);
42                         if (err) {
43                                 RTW_INFO("%s: Enable rx phy status FAIL!!", __FUNCTION__);
44                                 rcr &= ~BIT_APP_PHYSTS_8822B;
45                         }
46                 } else {
47                         err = rtw_halmac_config_rx_info(adapter_to_dvobj(p), HALMAC_DRV_INFO_NONE);
48                         if (err) {
49                                 RTW_INFO("%s: Disable rx phy status FAIL!!", __FUNCTION__);
50                                 rcr |= BIT_APP_PHYSTS_8822B;
51                         }
52                 }
53         }
54
55         err = rtw_write32(p, REG_RCR_8822B, rcr);
56         if (_FAIL == err)
57                 return _FALSE;
58
59         GET_HAL_DATA(p)->ReceiveConfig = rcr;
60         return _TRUE;
61 }
62
63 inline u8 rtl8822b_rcr_get(PADAPTER p, u32 *rcr)
64 {
65         u32 v32;
66
67         v32 = rtw_read32(p, REG_RCR_8822B);
68         if (rcr)
69                 *rcr = v32;
70         GET_HAL_DATA(p)->ReceiveConfig = v32;
71         return _TRUE;
72 }
73
74 inline u8 rtl8822b_rcr_check(PADAPTER p, u32 check_bit)
75 {
76         PHAL_DATA_TYPE hal;
77         u32 rcr;
78
79         hal = GET_HAL_DATA(p);
80         rcr = hal->ReceiveConfig;
81         if ((rcr & check_bit) == check_bit)
82                 return _TRUE;
83
84         return _FALSE;
85 }
86
87 inline u8 rtl8822b_rcr_add(PADAPTER p, u32 add)
88 {
89         PHAL_DATA_TYPE hal;
90         u32 rcr;
91         u8 ret = _TRUE;
92
93         hal = GET_HAL_DATA(p);
94
95         rcr = hal->ReceiveConfig;
96         rcr |= add;
97         if (rcr != hal->ReceiveConfig)
98                 ret = rtl8822b_rcr_config(p, rcr);
99
100         return ret;
101 }
102
103 inline u8 rtl8822b_rcr_clear(PADAPTER p, u32 clear)
104 {
105         PHAL_DATA_TYPE hal;
106         u32 rcr;
107         u8 ret = _TRUE;
108
109         hal = GET_HAL_DATA(p);
110
111         rcr = hal->ReceiveConfig;
112         rcr &= ~clear;
113         if (rcr != hal->ReceiveConfig)
114                 ret = rtl8822b_rcr_config(p, rcr);
115
116         return ret;
117 }
118
119 inline u8 rtl8822b_rx_ba_ssn_appended(PADAPTER p)
120 {
121         return rtl8822b_rcr_check(p, BIT_APP_BASSN_8822B);
122 }
123
124 inline u8 rtl8822b_rx_fcs_append_switch(PADAPTER p, u8 enable)
125 {
126         u32 rcr_bit;
127         u8 ret = _TRUE;
128
129         rcr_bit = BIT_APP_FCS_8822B;
130         if (_TRUE == enable)
131                 ret = rtl8822b_rcr_add(p, rcr_bit);
132         else
133                 ret = rtl8822b_rcr_clear(p, rcr_bit);
134
135         return ret;
136 }
137
138 inline u8 rtl8822b_rx_fcs_appended(PADAPTER p)
139 {
140         return rtl8822b_rcr_check(p, BIT_APP_FCS_8822B);
141 }
142
143 inline u8 rtl8822b_rx_tsf_addr_filter_config(PADAPTER p, u8 config)
144 {
145         u8 v8;
146         int err;
147
148         v8 = GET_HAL_DATA(p)->rx_tsf_addr_filter_config;
149
150         if (v8 != config) {
151
152                 err = rtw_write8(p, REG_NAN_RX_TSF_FILTER_8822B, config);
153                 if (_FAIL == err)
154                         return _FALSE;
155         }
156
157         GET_HAL_DATA(p)->rx_tsf_addr_filter_config = config;
158         return _TRUE;
159 }
160
161 /*
162  * Return:
163  *      _SUCCESS        Download Firmware OK.
164  *      _FAIL           Download Firmware FAIL!
165  */
166 s32 rtl8822b_fw_dl(PADAPTER adapter, u8 wowlan)
167 {
168         struct dvobj_priv *d;
169         int err;
170
171
172         if (_TRUE == wowlan) {
173                 RTW_INFO("%s: NOT support WOWLan firmware yet!\n", __FUNCTION__);
174                 return _FAIL;
175         }
176
177         d = adapter_to_dvobj(adapter);
178
179         err = rtw_halmac_dlfw_from_file(d, REALTEK_CONFIG_PATH "RTL8822Bfw_NIC.bin");
180         if (err) {
181                 RTW_INFO("%s: Download Firmware fail\n", __FUNCTION__);
182                 return _FALSE;
183         }
184
185         return _SUCCESS;
186 }