1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright(c) 2020 Realtek Corporation.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun * published by the Free Software Foundation.
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun * more details.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun *****************************************************************************/
15*4882a593Smuzhiyun #define _PHL_P2PPS_C_
16*4882a593Smuzhiyun #include "phl_headers.h"
17*4882a593Smuzhiyun #ifdef RTW_WKARD_P2PPS_REFINE
18*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS
phl_p2pps_init(struct phl_info_t * phl)19*4882a593Smuzhiyun enum rtw_phl_status phl_p2pps_init(struct phl_info_t *phl)
20*4882a593Smuzhiyun {
21*4882a593Smuzhiyun enum rtw_phl_status status = RTW_PHL_STATUS_SUCCESS;
22*4882a593Smuzhiyun struct rtw_phl_com_t *phl_com = phl->phl_com;
23*4882a593Smuzhiyun struct rtw_phl_p2pps_info *info;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun info = (struct rtw_phl_p2pps_info *)_os_mem_alloc(phl_to_drvpriv(phl),
26*4882a593Smuzhiyun sizeof(*info));
27*4882a593Smuzhiyun if (info == NULL)
28*4882a593Smuzhiyun return RTW_PHL_STATUS_RESOURCE;
29*4882a593Smuzhiyun _os_mem_set(phl_to_drvpriv(phl),
30*4882a593Smuzhiyun info, 0, sizeof(*info));
31*4882a593Smuzhiyun phl_com->p2pps_info = (void*)info;
32*4882a593Smuzhiyun info->phl_info = phl;
33*4882a593Smuzhiyun _os_spinlock_init(phl_to_drvpriv(phl), &info->p2pps_lock);
34*4882a593Smuzhiyun return status;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
phl_p2pps_deinit(struct phl_info_t * phl_info)37*4882a593Smuzhiyun void phl_p2pps_deinit(struct phl_info_t *phl_info)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun struct rtw_phl_com_t *phl_com = phl_info->phl_com;
40*4882a593Smuzhiyun struct rtw_phl_p2pps_info *info ;
41*4882a593Smuzhiyun info = (struct rtw_phl_p2pps_info *)phl_com->p2pps_info;
42*4882a593Smuzhiyun if (info) {
43*4882a593Smuzhiyun _os_spinlock_free(phl_to_drvpriv(phl_info), &info->p2pps_lock);
44*4882a593Smuzhiyun _os_mem_free(phl_to_drvpriv(phl_info), info, sizeof(*info));
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun phl_com->p2pps_info = NULL;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun void
_phl_p2pps_dump_single_noa_desc(struct rtw_phl_noa_desc * desc)50*4882a593Smuzhiyun _phl_p2pps_dump_single_noa_desc(struct rtw_phl_noa_desc *desc)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():enable = %d\n",
53*4882a593Smuzhiyun desc->enable);
54*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():start_t_h = 0x%x\n",
55*4882a593Smuzhiyun desc->start_t_h);
56*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():start_t_l = 0x%x\n",
57*4882a593Smuzhiyun desc->start_t_l);
58*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():interval = %d\n",
59*4882a593Smuzhiyun desc->interval);
60*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():duration = %d\n",
61*4882a593Smuzhiyun desc->duration);
62*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():count = %d\n",
63*4882a593Smuzhiyun desc->count);
64*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():noa_id = %d\n",
65*4882a593Smuzhiyun desc->noa_id);
66*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():tag = %d\n",
67*4882a593Smuzhiyun desc->tag);
68*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_single_noa_desc():w_role = 0x%p\n",
69*4882a593Smuzhiyun desc->w_role);
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun void
_phl_p2pps_dump_noa_table(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_info * info)73*4882a593Smuzhiyun _phl_p2pps_dump_noa_table(struct rtw_phl_p2pps_info *psinfo,
74*4882a593Smuzhiyun struct rtw_phl_noa_info *info)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun void *drvpriv = phlcom_to_drvpriv(psinfo->phl_info->phl_com);
77*4882a593Smuzhiyun struct rtw_phl_noa_desc *desc = NULL;
78*4882a593Smuzhiyun u8 i = 0;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():====>\n");
81*4882a593Smuzhiyun _os_spinlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
82*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA] info.en_desc_num = %d, pause = %d\n",
83*4882a593Smuzhiyun info->en_desc_num, info->paused);
84*4882a593Smuzhiyun for (i = 0; i < MAX_NOA_DESC; i++) {
85*4882a593Smuzhiyun desc = &info->noa_desc[i];
86*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]================DESC[%d]==================\n",
87*4882a593Smuzhiyun i);
88*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():enable = %d\n",
89*4882a593Smuzhiyun desc->enable);
90*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():start_t_h = 0x%x\n",
91*4882a593Smuzhiyun desc->start_t_h);
92*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():start_t_l = 0x%x\n",
93*4882a593Smuzhiyun desc->start_t_l);
94*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():interval = %d\n",
95*4882a593Smuzhiyun desc->interval);
96*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():duration = %d\n",
97*4882a593Smuzhiyun desc->duration);
98*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():count = %d\n",
99*4882a593Smuzhiyun desc->count);
100*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():noa_id = %d\n",
101*4882a593Smuzhiyun desc->noa_id);
102*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():tag = %d\n",
103*4882a593Smuzhiyun desc->tag);
104*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_dump_noa_table():w_role = 0x%p\n",
105*4882a593Smuzhiyun desc->w_role);
106*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]================DESC[%d]==================\n",
107*4882a593Smuzhiyun i);
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun struct rtw_phl_noa_info *
_phl_p2pps_get_noa_info_by_role(struct rtw_phl_p2pps_info * psinfo,struct rtw_wifi_role_t * wrole)113*4882a593Smuzhiyun _phl_p2pps_get_noa_info_by_role(struct rtw_phl_p2pps_info *psinfo,
114*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun u8 idx = get_role_idx(wrole);
117*4882a593Smuzhiyun return &psinfo->noa_info[idx];
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun struct rtw_phl_noa_desc *
_phl_p2pps_get_first_noa_desc_with_cnt255(struct phl_info_t * phl,struct rtw_phl_noa_info * info)121*4882a593Smuzhiyun _phl_p2pps_get_first_noa_desc_with_cnt255(struct phl_info_t *phl,
122*4882a593Smuzhiyun struct rtw_phl_noa_info *info)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun u8 i = 0;
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun struct rtw_phl_noa_desc *tmp_desc;
127*4882a593Smuzhiyun for (i = 0; i < MAX_NOA_DESC; i++) {
128*4882a593Smuzhiyun tmp_desc = &info->noa_desc[i];
129*4882a593Smuzhiyun if(tmp_desc->count == 255 && tmp_desc->enable) {
130*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_get_first_noa_desc_with_cnt255():get desc, tag = %d!!\n",
131*4882a593Smuzhiyun tmp_desc->tag);
132*4882a593Smuzhiyun return tmp_desc;
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun return NULL;
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun #ifdef RTW_WKARD_P2PPS_SINGLE_NOA
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun u8
_phl_p2pps_query_mcc_inprog_wkard(struct phl_info_t * phl_info,struct rtw_wifi_role_t * w_role)141*4882a593Smuzhiyun _phl_p2pps_query_mcc_inprog_wkard(struct phl_info_t *phl_info,
142*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun u8 ret = false;
145*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT
146*4882a593Smuzhiyun //ret = phl_mr_query_mcc_inprogress(phl_info, w_role,
147*4882a593Smuzhiyun // RTW_PHL_MCC_CHK_INPROGRESS);
148*4882a593Smuzhiyun #endif
149*4882a593Smuzhiyun return ret;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun struct rtw_wifi_role_t *
_phl_get_role_by_band_port(struct phl_info_t * phl_info,u8 hw_band,u8 hw_port)153*4882a593Smuzhiyun _phl_get_role_by_band_port(struct phl_info_t* phl_info,
154*4882a593Smuzhiyun u8 hw_band,
155*4882a593Smuzhiyun u8 hw_port)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun struct rtw_phl_com_t *phl_com = phl_info->phl_com;
158*4882a593Smuzhiyun struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
159*4882a593Smuzhiyun struct hw_band_ctl_t *band_ctrl = &(mr_ctl->band_ctrl[hw_band]);
160*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole = NULL;
161*4882a593Smuzhiyun u8 ridx = 0;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun for (ridx = 0; ridx < MAX_WIFI_ROLE_NUMBER; ridx++) {
164*4882a593Smuzhiyun if (!(band_ctrl->role_map & BIT(ridx)))
165*4882a593Smuzhiyun continue;
166*4882a593Smuzhiyun wrole = rtw_phl_get_wrole_by_ridx(phl_info->phl_com, ridx);
167*4882a593Smuzhiyun if (wrole == NULL)
168*4882a593Smuzhiyun continue;
169*4882a593Smuzhiyun if (wrole->hw_band == hw_band && wrole->hw_port == hw_port) {
170*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_get_role_by_band_port():role_id(%d) hw_band = %d, hw_port = %d\n",
171*4882a593Smuzhiyun ridx, wrole->hw_band, wrole->hw_port);
172*4882a593Smuzhiyun return wrole;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun return NULL;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun void
_phl_p2pps_calc_next_noa_s_time(struct phl_info_t * phl_info,struct rtw_wifi_role_t * w_role,struct rtw_phl_tsf32_tog_rpt * rpt,struct rtw_phl_noa_desc * orig_desc,struct rtw_phl_noa_desc * new_desc)179*4882a593Smuzhiyun _phl_p2pps_calc_next_noa_s_time(struct phl_info_t *phl_info,
180*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role,
181*4882a593Smuzhiyun struct rtw_phl_tsf32_tog_rpt *rpt,
182*4882a593Smuzhiyun struct rtw_phl_noa_desc *orig_desc,
183*4882a593Smuzhiyun struct rtw_phl_noa_desc *new_desc)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl_info);
186*4882a593Smuzhiyun u64 new_st = 0, old_st = 0;
187*4882a593Smuzhiyun u64 tog_t = 0, delta_t = 0, intv_cnt = 0;
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun _os_mem_cpy(d, new_desc, orig_desc, sizeof(*orig_desc));
190*4882a593Smuzhiyun old_st = (((u64)orig_desc->start_t_h << 32) | orig_desc->start_t_l);
191*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_calc_next_noa_s_time():old_st: 0x%08x %08x\n",
192*4882a593Smuzhiyun (u32)(old_st >> 32), (u32)old_st);
193*4882a593Smuzhiyun tog_t = (((u64)rpt->tsf_h << 32) | rpt->tsf_l);
194*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_calc_next_noa_s_time():tog_t = 0x%08x %08x\n",
195*4882a593Smuzhiyun (u32)(tog_t >> 32), (u32)tog_t);
196*4882a593Smuzhiyun delta_t = tog_t - old_st;
197*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_calc_next_noa_s_time():delta_t = 0x%08x %08x\n",
198*4882a593Smuzhiyun (u32)(delta_t >> 32), (u32)delta_t);
199*4882a593Smuzhiyun intv_cnt = _os_division64(delta_t, new_desc->interval) + 1;
200*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_calc_next_noa_s_time():intv_cnt = 0x%08x %08x\n",
201*4882a593Smuzhiyun (u32)(intv_cnt >> 32), (u32)intv_cnt);
202*4882a593Smuzhiyun new_st = old_st + (intv_cnt * new_desc->interval);
203*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_calc_next_noa_s_time():new_st = 0x%08x %08x\n",
204*4882a593Smuzhiyun (u32)(new_st >> 32), (u32)new_st);
205*4882a593Smuzhiyun new_desc->start_t_h = new_st >> 32;
206*4882a593Smuzhiyun new_desc->start_t_l = new_st & 0xFFFFFFFF;
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun
_phl_p2pps_ap_on_tsf32_tog(struct phl_info_t * phl_info,struct rtw_wifi_role_t * wrole,struct rtw_phl_tsf32_tog_rpt * rpt)209*4882a593Smuzhiyun void _phl_p2pps_ap_on_tsf32_tog(struct phl_info_t* phl_info,
210*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole,
211*4882a593Smuzhiyun struct rtw_phl_tsf32_tog_rpt *rpt)
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun struct rtw_phl_p2pps_info *psinfo = phl_to_p2pps_info(phl_info);
214*4882a593Smuzhiyun struct rtw_phl_noa_info *info = NULL;
215*4882a593Smuzhiyun struct rtw_phl_noa_desc *orig_desc = NULL;
216*4882a593Smuzhiyun struct rtw_phl_noa_desc new_desc = {0};
217*4882a593Smuzhiyun void *d = phl_to_drvpriv(phl_info);
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun info = _phl_p2pps_get_noa_info_by_role(psinfo, wrole);
220*4882a593Smuzhiyun orig_desc = _phl_p2pps_get_first_noa_desc_with_cnt255(phl_info, info);
221*4882a593Smuzhiyun if (orig_desc) {
222*4882a593Smuzhiyun _phl_p2pps_calc_next_noa_s_time(phl_info, wrole, rpt,
223*4882a593Smuzhiyun orig_desc, &new_desc);
224*4882a593Smuzhiyun _os_mem_cpy(d, orig_desc, &new_desc, sizeof(new_desc));
225*4882a593Smuzhiyun _phl_p2pps_dump_single_noa_desc(&new_desc);
226*4882a593Smuzhiyun if(psinfo->ops.tsf32_tog_update_single_noa)
227*4882a593Smuzhiyun psinfo->ops.tsf32_tog_update_single_noa(d, wrole, &new_desc);
228*4882a593Smuzhiyun } else {
229*4882a593Smuzhiyun return;
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun #endif
233*4882a593Smuzhiyun
phl_p2pps_tsf32_tog_handler(struct phl_info_t * phl_info)234*4882a593Smuzhiyun void phl_p2pps_tsf32_tog_handler(struct phl_info_t* phl_info)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun void *hal = phl_info->hal;
237*4882a593Smuzhiyun struct rtw_phl_tsf32_tog_rpt rpt = {0};
238*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole = NULL;
239*4882a593Smuzhiyun enum rtw_hal_status h_stat;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun h_stat = rtw_hal_get_tsf32_tog_rpt(hal, &rpt);
242*4882a593Smuzhiyun if (h_stat != RTW_HAL_STATUS_SUCCESS)
243*4882a593Smuzhiyun return;
244*4882a593Smuzhiyun if (!rpt.valid) {
245*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_WARNING_, "[NOA]phl_p2pps_tsf32_tog_handler():report not valid!!\n");
246*4882a593Smuzhiyun return;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun wrole = _phl_get_role_by_band_port(phl_info, rpt.band, rpt.port);
249*4882a593Smuzhiyun if (wrole) {
250*4882a593Smuzhiyun if (wrole->type == PHL_RTYPE_AP) {
251*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_tsf32_tog_handler():role(%d) is AP/GO mode, handle noa update\n",
252*4882a593Smuzhiyun wrole->id);
253*4882a593Smuzhiyun #ifdef RTW_WKARD_P2PPS_SINGLE_NOA
254*4882a593Smuzhiyun _phl_p2pps_ap_on_tsf32_tog(phl_info, wrole, &rpt);
255*4882a593Smuzhiyun #endif
256*4882a593Smuzhiyun } else if (wrole->type == PHL_RTYPE_STATION) {
257*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_tsf32_tog_handler():role(%d) is STA/GO mode, currently do nothing\n",
258*4882a593Smuzhiyun wrole->id);
259*4882a593Smuzhiyun /*Call NoA disable all?*/
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun } else {
262*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_WARNING_, "[NOA]phl_p2pps_tsf32_tog_handler():NULL ROLE!!, hwband = %d, hwport = %d\n",
263*4882a593Smuzhiyun rpt.band, rpt.port);
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun void
_phl_p2pps_copy_noa_desc(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_desc * dest,struct rtw_phl_noa_desc * src)268*4882a593Smuzhiyun _phl_p2pps_copy_noa_desc(struct rtw_phl_p2pps_info *psinfo,
269*4882a593Smuzhiyun struct rtw_phl_noa_desc *dest,
270*4882a593Smuzhiyun struct rtw_phl_noa_desc *src)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun void *drvpriv = phlcom_to_drvpriv(psinfo->phl_info->phl_com);
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun _os_spinlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
275*4882a593Smuzhiyun _os_mem_cpy(drvpriv, dest, src, sizeof(struct rtw_phl_noa_desc));
276*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun void
_phl_p2pps_clear_noa_desc(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_desc * desc)280*4882a593Smuzhiyun _phl_p2pps_clear_noa_desc(struct rtw_phl_p2pps_info *psinfo,
281*4882a593Smuzhiyun struct rtw_phl_noa_desc *desc)
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun void *drvpriv = phlcom_to_drvpriv(psinfo->phl_info->phl_com);
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun _os_spinlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
286*4882a593Smuzhiyun _os_mem_set(drvpriv, desc, 0, sizeof(struct rtw_phl_noa_desc));
287*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun void
_phl_p2pps_noa_increase_desc(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_info * info)291*4882a593Smuzhiyun _phl_p2pps_noa_increase_desc(struct rtw_phl_p2pps_info *psinfo,
292*4882a593Smuzhiyun struct rtw_phl_noa_info *info)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun void *drvpriv = phlcom_to_drvpriv(psinfo->phl_info->phl_com);
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun _os_spinlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
297*4882a593Smuzhiyun info->en_desc_num++;
298*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun void
_phl_p2pps_noa_decrease_desc(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_info * info)302*4882a593Smuzhiyun _phl_p2pps_noa_decrease_desc(struct rtw_phl_p2pps_info *psinfo,
303*4882a593Smuzhiyun struct rtw_phl_noa_info *info)
304*4882a593Smuzhiyun {
305*4882a593Smuzhiyun void *drvpriv = phlcom_to_drvpriv(psinfo->phl_info->phl_com);
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun _os_spinlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
308*4882a593Smuzhiyun if (info->en_desc_num > 0)
309*4882a593Smuzhiyun info->en_desc_num--;
310*4882a593Smuzhiyun else
311*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_WARNING_, "[NOA]_phl_p2pps_noa_decrease_desc():info->en_desc_num == 0! Flow error\n");
312*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun u8
_phl_p2pps_noa_should_activate(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_desc * in_desc)316*4882a593Smuzhiyun _phl_p2pps_noa_should_activate(struct rtw_phl_p2pps_info *psinfo,
317*4882a593Smuzhiyun struct rtw_phl_noa_desc *in_desc)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun u8 ret = true;
320*4882a593Smuzhiyun if (in_desc->tag == P2PPS_TRIG_GO) {
321*4882a593Smuzhiyun ret = true;
322*4882a593Smuzhiyun } else if (in_desc->tag == P2PPS_TRIG_GC) {
323*4882a593Smuzhiyun ret = true;
324*4882a593Smuzhiyun } else if (in_desc->tag == P2PPS_TRIG_GC_255) {
325*4882a593Smuzhiyun ret = true;
326*4882a593Smuzhiyun } else if (in_desc->tag == P2PPS_TRIG_2G_SCC_1AP_1STA_BT) {
327*4882a593Smuzhiyun ret = true;
328*4882a593Smuzhiyun } else if (in_desc->tag == P2PPS_TRIG_MCC) {
329*4882a593Smuzhiyun ret = false;
330*4882a593Smuzhiyun #ifdef RTW_WKARD_P2PPS_NOA_MCC
331*4882a593Smuzhiyun goto exit;
332*4882a593Smuzhiyun #endif
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun #ifdef RTW_WKARD_P2PPS_SINGLE_NOA
335*4882a593Smuzhiyun /*Currently should only notify MRC for limit request*/
336*4882a593Smuzhiyun /*Under count == 255 case */
337*4882a593Smuzhiyun if (in_desc->count != 255) {
338*4882a593Smuzhiyun if (_phl_p2pps_query_mcc_inprog_wkard(psinfo->phl_info,
339*4882a593Smuzhiyun in_desc->w_role)) {
340*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_WARNING_, "[NOA]_phl_p2pps_noa_should_activate():mcc in progress and noa requset != 255, currently not handling!\n");
341*4882a593Smuzhiyun ret = false;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun } else {
344*4882a593Smuzhiyun /* open when mr ready*/
345*4882a593Smuzhiyun /*
346*4882a593Smuzhiyun if (phl_mr_noa_dur_lim_change(psinfo->phl_info,
347*4882a593Smuzhiyun in_desc->w_role, in_desc)) {
348*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_should_activate():mrc take over this req!\n");
349*4882a593Smuzhiyun ret = false;
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun */
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun #endif
354*4882a593Smuzhiyun exit:
355*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_should_activate():tag = %d, return = %d\n",
356*4882a593Smuzhiyun in_desc->tag, ret);
357*4882a593Smuzhiyun return ret;
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun u8
_phl_p2pps_noa_is_all_disable(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_info * info)361*4882a593Smuzhiyun _phl_p2pps_noa_is_all_disable(struct rtw_phl_p2pps_info *psinfo,
362*4882a593Smuzhiyun struct rtw_phl_noa_info *info)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun u8 i = 0;
365*4882a593Smuzhiyun void *drvpriv = phlcom_to_drvpriv(psinfo->phl_info->phl_com);
366*4882a593Smuzhiyun _os_spinlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
367*4882a593Smuzhiyun for (i = 0; i < MAX_NOA_DESC; i++) {
368*4882a593Smuzhiyun struct rtw_phl_noa_desc *desc = &info->noa_desc[i];
369*4882a593Smuzhiyun if(desc->enable) {
370*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
371*4882a593Smuzhiyun return false;
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
375*4882a593Smuzhiyun return true;
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun u8
_phl_p2pps_noa_assign_noaid(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_info * info,struct rtw_phl_noa_desc * desc)379*4882a593Smuzhiyun _phl_p2pps_noa_assign_noaid(struct rtw_phl_p2pps_info *psinfo,
380*4882a593Smuzhiyun struct rtw_phl_noa_info *info,
381*4882a593Smuzhiyun struct rtw_phl_noa_desc *desc)
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun u8 max = 0, id = NOAID_NONE, i = 0;
384*4882a593Smuzhiyun void *drvpriv = phlcom_to_drvpriv(psinfo->phl_info->phl_com);
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun _os_spinlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
387*4882a593Smuzhiyun if (info->en_desc_num == 0) {
388*4882a593Smuzhiyun id = 0;/*not inited flow*/
389*4882a593Smuzhiyun } else {
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun for (i = 0; i < MAX_NOA_DESC; i++) {
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun if (info->noa_desc[i].noa_id == NOAID_NONE)
394*4882a593Smuzhiyun continue;
395*4882a593Smuzhiyun if (info->noa_desc[i].noa_id > max)
396*4882a593Smuzhiyun max = info->noa_desc[i].noa_id;
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun if(max != 0)
399*4882a593Smuzhiyun id = max + 1;
400*4882a593Smuzhiyun else id = 0;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
403*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_assign_noaid(): Final ID = %d.\n",
404*4882a593Smuzhiyun id);
405*4882a593Smuzhiyun return id;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun enum rtw_phl_status
_phl_p2pps_noa_disable(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_info * noa_info,struct rtw_phl_noa_desc * noa_desc,u8 clear_desc)409*4882a593Smuzhiyun _phl_p2pps_noa_disable(struct rtw_phl_p2pps_info *psinfo,
410*4882a593Smuzhiyun struct rtw_phl_noa_info *noa_info,
411*4882a593Smuzhiyun struct rtw_phl_noa_desc *noa_desc,
412*4882a593Smuzhiyun u8 clear_desc)
413*4882a593Smuzhiyun {
414*4882a593Smuzhiyun enum rtw_phl_status ret = RTW_PHL_STATUS_FAILURE;
415*4882a593Smuzhiyun enum rtw_hal_status hal_ret = RTW_HAL_STATUS_FAILURE;
416*4882a593Smuzhiyun void *drvpriv = phlcom_to_drvpriv(psinfo->phl_info->phl_com);
417*4882a593Smuzhiyun void *hal = psinfo->phl_info->hal;
418*4882a593Smuzhiyun struct rtw_phl_stainfo_t *sta_info;
419*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role = NULL;
420*4882a593Smuzhiyun struct phl_info_t *phl_info = psinfo->phl_info;
421*4882a593Smuzhiyun u8 en_to_fw = 0;
422*4882a593Smuzhiyun u8 idx = 0;
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun if (noa_info->paused && clear_desc) {
425*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_disable():NoA info is in puase state, clear desc only!\n");
426*4882a593Smuzhiyun _phl_p2pps_clear_noa_desc(psinfo,noa_desc);
427*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun w_role = noa_desc->w_role;
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun _os_spinlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
433*4882a593Smuzhiyun en_to_fw = (noa_desc->noa_id != NOAID_NONE && noa_desc->enable);
434*4882a593Smuzhiyun _os_spinunlock(drvpriv, &psinfo->p2pps_lock, _bh, NULL);
435*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NoA]%s(): en_to_fw(%d), clear_desc(%d)\n",
436*4882a593Smuzhiyun __func__, en_to_fw, clear_desc);
437*4882a593Smuzhiyun if (en_to_fw) {
438*4882a593Smuzhiyun sta_info = rtw_phl_get_stainfo_self(psinfo->phl_info,
439*4882a593Smuzhiyun noa_desc->w_role);
440*4882a593Smuzhiyun hal_ret = rtw_hal_noa_disable(hal, noa_info, noa_desc,
441*4882a593Smuzhiyun sta_info->macid);
442*4882a593Smuzhiyun if (hal_ret!= RTW_HAL_STATUS_SUCCESS) {
443*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_ERR_, "[NOA]_phl_p2pps_noa_disable():NoA Disable fail! tag = %d, ID = %d, HAL return = %d\n",
444*4882a593Smuzhiyun noa_desc->tag, noa_desc->noa_id, hal_ret);
445*4882a593Smuzhiyun ret = RTW_PHL_STATUS_FAILURE;
446*4882a593Smuzhiyun } else {
447*4882a593Smuzhiyun _phl_p2pps_noa_decrease_desc(psinfo,noa_info);
448*4882a593Smuzhiyun ret = RTW_PHL_STATUS_SUCCESS;
449*4882a593Smuzhiyun if (clear_desc)
450*4882a593Smuzhiyun _phl_p2pps_clear_noa_desc(psinfo,noa_desc);
451*4882a593Smuzhiyun }
452*4882a593Smuzhiyun } else {
453*4882a593Smuzhiyun /*not enabled to fw case*/
454*4882a593Smuzhiyun ret = RTW_PHL_STATUS_SUCCESS;
455*4882a593Smuzhiyun if (clear_desc)
456*4882a593Smuzhiyun _phl_p2pps_clear_noa_desc(psinfo,noa_desc);
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun if(RTW_PHL_STATUS_SUCCESS == ret) {
460*4882a593Smuzhiyun if(NULL != w_role) {
461*4882a593Smuzhiyun /* notify BTC */
462*4882a593Smuzhiyun /* copy noa_desc array to w_role*/
463*4882a593Smuzhiyun for (idx = 0; idx < MAX_NOA_DESC; idx ++) {
464*4882a593Smuzhiyun _phl_p2pps_copy_noa_desc(psinfo,
465*4882a593Smuzhiyun w_role->noa_desc + idx,
466*4882a593Smuzhiyun noa_info->noa_desc + idx);
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun phl_role_noa_notify(phl_info, w_role);
469*4882a593Smuzhiyun } else {
470*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_WARNING_, "[NOA]_phl_p2pps_noa_disable():w_role in noa_desc is NULL, not to notify to BTC\n");
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun return ret;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
_phl_p2pps_noa_disable_all(struct phl_info_t * phl,struct rtw_wifi_role_t * w_role)477*4882a593Smuzhiyun void _phl_p2pps_noa_disable_all(struct phl_info_t *phl,
478*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role)
479*4882a593Smuzhiyun {
480*4882a593Smuzhiyun struct rtw_phl_p2pps_info *psinfo = phl_to_p2pps_info(phl);
481*4882a593Smuzhiyun u8 role_id = get_role_idx(w_role);
482*4882a593Smuzhiyun struct rtw_phl_noa_info *noa_info = &psinfo->noa_info[role_id];
483*4882a593Smuzhiyun u8 i = 0;
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_disable_all():====>\n");
486*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_disable_all():Disable all NoA for wrole(%d)!\n",
487*4882a593Smuzhiyun role_id);
488*4882a593Smuzhiyun _phl_p2pps_dump_noa_table(phl_to_p2pps_info(phl),noa_info);
489*4882a593Smuzhiyun for (i = 0; i < MAX_NOA_DESC; i++) {
490*4882a593Smuzhiyun struct rtw_phl_noa_desc *desc = &noa_info->noa_desc[i];
491*4882a593Smuzhiyun if (desc->enable) {
492*4882a593Smuzhiyun _phl_p2pps_noa_disable(psinfo, noa_info, desc, true);
493*4882a593Smuzhiyun }
494*4882a593Smuzhiyun }
495*4882a593Smuzhiyun noa_info->paused = false;
496*4882a593Smuzhiyun _phl_p2pps_dump_noa_table(phl_to_p2pps_info(phl),noa_info);
497*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_disable_all():<====\n");
498*4882a593Smuzhiyun }
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun enum rtw_phl_status
_phl_p2pps_noa_enable(struct rtw_phl_p2pps_info * psinfo,struct rtw_phl_noa_info * noa_info,struct rtw_phl_noa_desc * noa_desc,struct rtw_phl_noa_desc * in_desc)501*4882a593Smuzhiyun _phl_p2pps_noa_enable(struct rtw_phl_p2pps_info *psinfo,
502*4882a593Smuzhiyun struct rtw_phl_noa_info *noa_info,
503*4882a593Smuzhiyun struct rtw_phl_noa_desc *noa_desc,
504*4882a593Smuzhiyun struct rtw_phl_noa_desc *in_desc)
505*4882a593Smuzhiyun {
506*4882a593Smuzhiyun enum rtw_phl_status ret = RTW_PHL_STATUS_FAILURE;
507*4882a593Smuzhiyun enum rtw_hal_status hal_ret = RTW_HAL_STATUS_FAILURE;
508*4882a593Smuzhiyun void *hal = psinfo->phl_info->hal;
509*4882a593Smuzhiyun struct rtw_phl_stainfo_t *sta_info;
510*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role = NULL;
511*4882a593Smuzhiyun struct phl_info_t *phl_info = psinfo->phl_info;
512*4882a593Smuzhiyun u8 idx = 0;
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NoA]%s()\n",
515*4882a593Smuzhiyun __func__);
516*4882a593Smuzhiyun _phl_p2pps_copy_noa_desc(psinfo, noa_desc, in_desc);
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun /* get w_role */
519*4882a593Smuzhiyun w_role = noa_desc->w_role;
520*4882a593Smuzhiyun
521*4882a593Smuzhiyun if(NULL != w_role) {
522*4882a593Smuzhiyun /* notify BTC */
523*4882a593Smuzhiyun /* copy noa_desc array to w_role */
524*4882a593Smuzhiyun for (idx = 0; idx < MAX_NOA_DESC; idx ++) {
525*4882a593Smuzhiyun _phl_p2pps_copy_noa_desc(psinfo,
526*4882a593Smuzhiyun w_role->noa_desc+idx,
527*4882a593Smuzhiyun noa_info->noa_desc+idx);
528*4882a593Smuzhiyun }
529*4882a593Smuzhiyun phl_role_noa_notify(phl_info, w_role);
530*4882a593Smuzhiyun } else {
531*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_WARNING_, "[NOA]_phl_p2pps_noa_enable():w_role in noa_desc is NULL, not to notify to BTC\n");
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun
534*4882a593Smuzhiyun if (noa_info->paused) {
535*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_enable():NoA is in pause state, record request and leave\n");
536*4882a593Smuzhiyun return RTW_PHL_STATUS_SUCCESS;
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun if (_phl_p2pps_noa_should_activate(psinfo, noa_desc)) {
539*4882a593Smuzhiyun noa_desc->noa_id = _phl_p2pps_noa_assign_noaid(psinfo, noa_info,
540*4882a593Smuzhiyun noa_desc);
541*4882a593Smuzhiyun sta_info = rtw_phl_get_stainfo_self(psinfo->phl_info,
542*4882a593Smuzhiyun noa_desc->w_role);
543*4882a593Smuzhiyun hal_ret = rtw_hal_noa_enable(hal, noa_info, noa_desc,
544*4882a593Smuzhiyun sta_info->macid);
545*4882a593Smuzhiyun if (hal_ret != RTW_HAL_STATUS_SUCCESS) {
546*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_ERR_, "[NOA]_phl_p2pps_noa_enable():NoA enable fail! tag = %d, ID = %d, HAL return = %d\n",
547*4882a593Smuzhiyun noa_desc->tag, noa_desc->noa_id, hal_ret);
548*4882a593Smuzhiyun noa_desc->noa_id = NOAID_NONE;
549*4882a593Smuzhiyun if (hal_ret == RTW_HAL_STATUS_RESOURCE)
550*4882a593Smuzhiyun ret = RTW_PHL_STATUS_RESOURCE;
551*4882a593Smuzhiyun else
552*4882a593Smuzhiyun ret = RTW_PHL_STATUS_FAILURE;
553*4882a593Smuzhiyun } else {
554*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]_phl_p2pps_noa_enable():NoA enable SUCCESS! tag = %d, ID = %d, HAL return = %d\n",
555*4882a593Smuzhiyun noa_desc->tag, noa_desc->noa_id, hal_ret);
556*4882a593Smuzhiyun _phl_p2pps_noa_increase_desc(psinfo,noa_info);
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun ret = RTW_PHL_STATUS_SUCCESS;
559*4882a593Smuzhiyun }
560*4882a593Smuzhiyun } else {
561*4882a593Smuzhiyun noa_desc->noa_id = NOAID_NONE; /*not activate*/
562*4882a593Smuzhiyun ret = RTW_PHL_STATUS_SUCCESS;
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun return ret;
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun void
phl_p2pps_noa_resume_all(struct phl_info_t * phl,struct rtw_wifi_role_t * w_role)568*4882a593Smuzhiyun phl_p2pps_noa_resume_all(struct phl_info_t *phl,
569*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role)
570*4882a593Smuzhiyun {
571*4882a593Smuzhiyun struct rtw_phl_p2pps_info *psinfo = phl_to_p2pps_info(phl);
572*4882a593Smuzhiyun u8 role_idx = get_role_idx(w_role);
573*4882a593Smuzhiyun struct rtw_phl_noa_info *noa_info = &psinfo->noa_info[role_idx];
574*4882a593Smuzhiyun u8 i = 0;
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_resume_all():====>\n");
577*4882a593Smuzhiyun if (!noa_info->paused) {
578*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_resume_all():NoA not paused on role:%d\n",
579*4882a593Smuzhiyun w_role->id);
580*4882a593Smuzhiyun goto exit;
581*4882a593Smuzhiyun }
582*4882a593Smuzhiyun // _phl_p2pps_dump_noa_table(phl_to_p2pps_info(phl),noa_info);
583*4882a593Smuzhiyun noa_info->paused = false;
584*4882a593Smuzhiyun for (i = 0; i < MAX_NOA_DESC; i++) {
585*4882a593Smuzhiyun struct rtw_phl_noa_desc *desc = &noa_info->noa_desc[i];
586*4882a593Smuzhiyun if(desc->enable)
587*4882a593Smuzhiyun _phl_p2pps_noa_enable(psinfo, noa_info, desc, desc);
588*4882a593Smuzhiyun }
589*4882a593Smuzhiyun // _phl_p2pps_dump_noa_table(phl_to_p2pps_info(phl),noa_info);
590*4882a593Smuzhiyun exit:
591*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_resume_all():<====\n");
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun void
phl_p2pps_noa_all_role_resume(struct phl_info_t * phl_info,u8 band_idx)595*4882a593Smuzhiyun phl_p2pps_noa_all_role_resume(struct phl_info_t *phl_info, u8 band_idx)
596*4882a593Smuzhiyun {
597*4882a593Smuzhiyun struct rtw_phl_com_t *phl_com = phl_info->phl_com;
598*4882a593Smuzhiyun struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
599*4882a593Smuzhiyun struct hw_band_ctl_t *band_ctrl = &(mr_ctl->band_ctrl[band_idx]);
600*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole = NULL;
601*4882a593Smuzhiyun u8 ridx = 0;
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun for (ridx = 0; ridx < MAX_WIFI_ROLE_NUMBER; ridx++) {
604*4882a593Smuzhiyun if (!(band_ctrl->role_map & BIT(ridx)))
605*4882a593Smuzhiyun continue;
606*4882a593Smuzhiyun wrole = rtw_phl_get_wrole_by_ridx(phl_info->phl_com, ridx);
607*4882a593Smuzhiyun if (wrole == NULL)
608*4882a593Smuzhiyun continue;
609*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]p2pps_noa_all_role_resume():role_id(%d)\n",
610*4882a593Smuzhiyun ridx);
611*4882a593Smuzhiyun phl_p2pps_noa_resume_all(phl_info, wrole);
612*4882a593Smuzhiyun }
613*4882a593Smuzhiyun }
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun void
phl_p2pps_noa_pause_all(struct phl_info_t * phl,struct rtw_wifi_role_t * w_role)616*4882a593Smuzhiyun phl_p2pps_noa_pause_all(struct phl_info_t *phl,
617*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role)
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun struct rtw_phl_p2pps_info *psinfo = phl_to_p2pps_info(phl);
620*4882a593Smuzhiyun u8 role_idx = get_role_idx(w_role);
621*4882a593Smuzhiyun struct rtw_phl_noa_info *noa_info = &psinfo->noa_info[role_idx];
622*4882a593Smuzhiyun u8 i = 0;
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_pause_all():====>\n");
625*4882a593Smuzhiyun //_phl_p2pps_dump_noa_table(phl_to_p2pps_info(phl),noa_info);
626*4882a593Smuzhiyun if (noa_info->paused) {
627*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_pause_all():This role(%d) NoA is in pause state\n",
628*4882a593Smuzhiyun role_idx);
629*4882a593Smuzhiyun goto exit;
630*4882a593Smuzhiyun }
631*4882a593Smuzhiyun noa_info->paused = true;
632*4882a593Smuzhiyun for (i = 0; i < MAX_NOA_DESC; i++) {
633*4882a593Smuzhiyun struct rtw_phl_noa_desc *desc = &noa_info->noa_desc[i];
634*4882a593Smuzhiyun _phl_p2pps_noa_disable(psinfo, noa_info, desc, false);
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun //_phl_p2pps_dump_noa_table(phl_to_p2pps_info(phl),noa_info);
637*4882a593Smuzhiyun exit:
638*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_pause_all():<====\n");
639*4882a593Smuzhiyun }
640*4882a593Smuzhiyun
phl_p2pps_noa_all_role_pause(struct phl_info_t * phl_info,u8 band_idx)641*4882a593Smuzhiyun void phl_p2pps_noa_all_role_pause(struct phl_info_t *phl_info, u8 band_idx)
642*4882a593Smuzhiyun {
643*4882a593Smuzhiyun struct rtw_phl_com_t *phl_com = phl_info->phl_com;
644*4882a593Smuzhiyun struct mr_ctl_t *mr_ctl = phlcom_to_mr_ctrl(phl_com);
645*4882a593Smuzhiyun struct hw_band_ctl_t *band_ctrl = &(mr_ctl->band_ctrl[band_idx]);
646*4882a593Smuzhiyun struct rtw_wifi_role_t *wrole = NULL;
647*4882a593Smuzhiyun u8 ridx = 0;
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun for (ridx = 0; ridx < MAX_WIFI_ROLE_NUMBER; ridx++) {
650*4882a593Smuzhiyun if (!(band_ctrl->role_map & BIT(ridx)))
651*4882a593Smuzhiyun continue;
652*4882a593Smuzhiyun wrole = rtw_phl_get_wrole_by_ridx(phl_info->phl_com, ridx);
653*4882a593Smuzhiyun if (wrole == NULL)
654*4882a593Smuzhiyun continue;
655*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_all_role_pause():role_id(%d)\n",
656*4882a593Smuzhiyun ridx);
657*4882a593Smuzhiyun phl_p2pps_noa_pause_all(phl_info, wrole);
658*4882a593Smuzhiyun }
659*4882a593Smuzhiyun }
660*4882a593Smuzhiyun
phl_p2pps_noa_disable_all(struct phl_info_t * phl_info,struct rtw_wifi_role_t * w_role)661*4882a593Smuzhiyun void phl_p2pps_noa_disable_all(struct phl_info_t *phl_info,
662*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role)
663*4882a593Smuzhiyun {
664*4882a593Smuzhiyun #ifdef RTW_WKARD_P2PPS_SINGLE_NOA
665*4882a593Smuzhiyun struct rtw_phl_noa_desc dis_desc = {0};
666*4882a593Smuzhiyun /*for notify MR for limitation disabled*/
667*4882a593Smuzhiyun dis_desc.enable = false;
668*4882a593Smuzhiyun dis_desc.w_role = w_role;
669*4882a593Smuzhiyun /*open when mr ready*/
670*4882a593Smuzhiyun //phl_mr_noa_dur_lim_change(phl_info, w_role, &dis_desc);
671*4882a593Smuzhiyun #endif
672*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_disable_all():====>\n");
673*4882a593Smuzhiyun _phl_p2pps_noa_disable_all(phl_info, w_role);
674*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_disable_all():Disable TSF 32 TOG for role %d\n",
675*4882a593Smuzhiyun w_role->id);
676*4882a593Smuzhiyun rtw_hal_tsf32_tog_disable(phl_info->hal, w_role);
677*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]phl_p2pps_noa_disable_all():<====\n");
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun
phl_p2pps_query_noa_with_cnt255(struct phl_info_t * phl_info,struct rtw_wifi_role_t * w_role,struct rtw_phl_noa_desc * desc)680*4882a593Smuzhiyun void phl_p2pps_query_noa_with_cnt255(struct phl_info_t* phl_info,
681*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role, struct rtw_phl_noa_desc *desc)
682*4882a593Smuzhiyun {
683*4882a593Smuzhiyun struct rtw_phl_p2pps_info *psinfo = phl_to_p2pps_info(phl_info);
684*4882a593Smuzhiyun u8 role_idx = get_role_idx(w_role);
685*4882a593Smuzhiyun struct rtw_phl_noa_info *info = &psinfo->noa_info[role_idx];
686*4882a593Smuzhiyun struct rtw_phl_noa_desc *tmp_desc = NULL;
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun tmp_desc = _phl_p2pps_get_first_noa_desc_with_cnt255(phl_info, info);
689*4882a593Smuzhiyun if (tmp_desc) {
690*4882a593Smuzhiyun _phl_p2pps_copy_noa_desc(psinfo, desc, tmp_desc);
691*4882a593Smuzhiyun } else {
692*4882a593Smuzhiyun desc->enable = false;
693*4882a593Smuzhiyun desc->w_role = w_role;
694*4882a593Smuzhiyun }
695*4882a593Smuzhiyun }
696*4882a593Smuzhiyun
697*4882a593Smuzhiyun enum rtw_phl_status
rtw_phl_p2pps_noa_update(void * phl,struct rtw_phl_noa_desc * in_desc)698*4882a593Smuzhiyun rtw_phl_p2pps_noa_update(void *phl,
699*4882a593Smuzhiyun struct rtw_phl_noa_desc *in_desc)
700*4882a593Smuzhiyun {
701*4882a593Smuzhiyun enum rtw_phl_status ret= RTW_PHL_STATUS_FAILURE;
702*4882a593Smuzhiyun struct phl_info_t *phl_info = (struct phl_info_t *)phl;
703*4882a593Smuzhiyun struct rtw_phl_p2pps_info *psinfo = phl_to_p2pps_info(phl_info);
704*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role = in_desc->w_role;
705*4882a593Smuzhiyun u8 role_id = get_role_idx(w_role);
706*4882a593Smuzhiyun struct rtw_phl_noa_info *noa_info = &psinfo->noa_info[role_id];
707*4882a593Smuzhiyun u8 desc_idx = in_desc->tag;
708*4882a593Smuzhiyun struct rtw_phl_noa_desc *noa_desc = &noa_info->noa_desc[desc_idx];
709*4882a593Smuzhiyun
710*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_update():DUMP BEFORE!\n");
711*4882a593Smuzhiyun _phl_p2pps_dump_noa_table(psinfo, noa_info);
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_update():cur FW en desc num = %d\n",
714*4882a593Smuzhiyun noa_info->en_desc_num);
715*4882a593Smuzhiyun if (in_desc->enable) {
716*4882a593Smuzhiyun if (_phl_p2pps_noa_is_all_disable(psinfo, noa_info)) {
717*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_update():roleid(%d) Enable TSF 32 Toggle!\n",
718*4882a593Smuzhiyun role_id);
719*4882a593Smuzhiyun rtw_hal_tsf32_tog_enable(phl_info->hal, in_desc->w_role);
720*4882a593Smuzhiyun /*todo set TSF_ BIT TOG H2C ON*/
721*4882a593Smuzhiyun }
722*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_update():Tag = %d, NoA enable request!\n",
723*4882a593Smuzhiyun in_desc->tag);
724*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_update():Tag = %d, NoA disable origninl req first!\n",
725*4882a593Smuzhiyun in_desc->tag);
726*4882a593Smuzhiyun _phl_p2pps_noa_disable(psinfo, noa_info, noa_desc, true);
727*4882a593Smuzhiyun ret = _phl_p2pps_noa_enable(psinfo, noa_info, noa_desc,
728*4882a593Smuzhiyun in_desc);
729*4882a593Smuzhiyun } else {
730*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_update():Tag = %d, NoA disable request!\n",
731*4882a593Smuzhiyun in_desc->tag);
732*4882a593Smuzhiyun ret = _phl_p2pps_noa_disable(psinfo, noa_info, noa_desc, true);
733*4882a593Smuzhiyun if (_phl_p2pps_noa_is_all_disable(psinfo, noa_info)) {
734*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_update():roleid(%d) Disable TSF 32 Toggle!\n",
735*4882a593Smuzhiyun role_id);
736*4882a593Smuzhiyun rtw_hal_tsf32_tog_disable(phl_info->hal, in_desc->w_role);
737*4882a593Smuzhiyun /*todo set TSF_ BIT TOG H2C OFF*/
738*4882a593Smuzhiyun }
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_update():DUMP AFTER!\n");
741*4882a593Smuzhiyun _phl_p2pps_dump_noa_table(psinfo, noa_info);
742*4882a593Smuzhiyun return ret;
743*4882a593Smuzhiyun }
744*4882a593Smuzhiyun
rtw_phl_p2pps_noa_disable_all(void * phl,struct rtw_wifi_role_t * w_role)745*4882a593Smuzhiyun void rtw_phl_p2pps_noa_disable_all(void *phl,
746*4882a593Smuzhiyun struct rtw_wifi_role_t *w_role)
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "[NOA]rtw_phl_p2pps_noa_disable_all()!\n");
749*4882a593Smuzhiyun phl_p2pps_noa_disable_all((struct phl_info_t *)phl, w_role);
750*4882a593Smuzhiyun }
751*4882a593Smuzhiyun
rtw_phl_p2pps_init_ops(void * phl,struct rtw_phl_p2pps_ops * ops)752*4882a593Smuzhiyun void rtw_phl_p2pps_init_ops(void *phl,
753*4882a593Smuzhiyun struct rtw_phl_p2pps_ops *ops)
754*4882a593Smuzhiyun {
755*4882a593Smuzhiyun struct phl_info_t *phl_info = (struct phl_info_t *)phl;
756*4882a593Smuzhiyun struct rtw_phl_p2pps_info *psinfo = NULL;
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun psinfo = phl_to_p2pps_info(phl_info);
759*4882a593Smuzhiyun psinfo->ops.priv = ops->priv;
760*4882a593Smuzhiyun psinfo->ops.tsf32_tog_update_noa = ops->tsf32_tog_update_noa;
761*4882a593Smuzhiyun psinfo->ops.tsf32_tog_update_single_noa = ops->tsf32_tog_update_single_noa;
762*4882a593Smuzhiyun PHL_TRACE(COMP_PHL_P2PPS, _PHL_INFO_, "rtw_phl_p2pps_init_ops(): init ok\n");
763*4882a593Smuzhiyun }
764*4882a593Smuzhiyun #endif
765*4882a593Smuzhiyun #endif
766